1
0
-1
题意:
找出一条最短的路出到边界。
思路:
这题一开始以为不会超时,结果写完给你一个TLE,最后想到,bfs是以次数为关键的,而且之所以超时是因为我拓展的枝条太多了,而且有些路是重复走的,所以记录一下每个地方最快到达就行了,如果大于最小值,我不如直接在最小值拓展,还用你绕路走的路吗。
AC代码:
#include<iostream>
#include<set>
#include<map>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long LL;
const int N=100000+1000;
#define T 100+50
int r,c,ans,tarx,tary;
char s[T][T];
int fx[][2] = {{1,0},{0,1},{-1,0},{0,-1}};
struct node
{
int x,y,cnt;
node(){}
node(int _1,int _2,int _3):x(_1),y(_2),cnt(_3){}
bool operator<(const node& b)const{
return cnt>b.cnt;
}
};
priority_queue<node> q;
void BFS()
{
map< pair<int,int>,int > mp;
while(!q.empty())q.pop();
q.push(node(tarx,tary,0));
mp[make_pair(tarx,tary)] = 0;
node p;
while(!q.empty())
{
p = q.top();q.pop();
if(p.x==0||p.x==r-1||p.y==0||p.y==c-1){
ans = p.cnt;
break;
}
for(int i=0;i<4;++i){
int tx=p.x+fx[i][0],
ty=p.y+fx[i][1];
bool flag = false;
pair<int,int> pir(tx,ty);
if(tx>=0&&tx<r&&ty>=0&&ty<c&&s[tx][ty]!='#'){
int tmp = 0;
if(mp.count(pir)!=0)flag=true;
if(s[tx][ty]=='*')tmp++;
if(mp[pir]>p.cnt+1||!flag)
q.push(node(tx,ty,p.cnt+tmp)),mp[pir]=p.cnt+tmp;
}
}
}
}
int main()
{
#ifdef cdzsc
freopen("in.txt","r",stdin);
#endif
int n,m,i,j,k;
scanf("%d",&n);
while(n--)
{
ans = INF;
scanf("%d%d",&r,&c);
for(i=0;i<r;++i){
for(j=0;j<c;++j){
scanf(" %c",&s[i][j]);
if(s[i][j]=='@'){
tarx = i;tary = j;
}
}
}
BFS();
if(ans==INF)ans=-1;
printf("%d\n",ans);
}
return 0;
}