bfs + 优先队列
题目大意:骑士r救公主a,杀死一个守卫x要多花一个单位时间,墙壁#,道路@,求最短时间
#include<cstdio> #include<queue> #include<cstring> using namespace std; const int maxn=205; struct node { int x,y,w; friend bool operator < (node a,node b) { return a.w>b.w; } } aa,bb,pp; priority_queue<node> q; int t,n,m,i,j,ans,flag,sx,sy,ex,ey,nx,ny,dx[4]={1,0,-1,0},dy[4]={0,1,0,-1},v[maxn][maxn]; char s[maxn][maxn]; void bfs() { aa.x=sx; aa.y=sy; aa.w=0; q.push(aa); v[sx][sy]=1; while(q.size()) { bb=q.top(); //printf("%d ",bb.w); q.pop(); if(bb.x==ex&&bb.y==ey) { ans=bb.w; flag=1; break; } for(i=0; i<4; i++) { nx=bb.x+dx[i]; ny=bb.y+dy[i]; if(nx>=0&&nx<n&&ny>=0&&ny<m&&v[nx][ny]!=1) { if(s[nx][ny]=='@') { pp.x=nx; pp.y=ny; pp.w=bb.w+1; q.push(pp); } else if(s[nx][ny]=='x') { pp.x=nx; pp.y=ny; pp.w=bb.w+2; q.push(pp); } v[nx][ny]=1; } } } } int main() { while(scanf("%d",&t)!=EOF) { while(t--) { while(q.size()) q.pop(); flag=0; memset(v,0,sizeof(v)); scanf("%d%d",&n,&m); for(i=0; i<n; i++) { scanf("%s",&s[i]); for(j=0; j<m; j++) { if(s[i][j]=='r') { sx=i; sy=j; } if(s[i][j]=='a') { ex=i; ey=j; s[i][j]='@'; } } } //printf("%d %d %d %d\n",sx,sy,ex,ey); bfs(); if(flag) printf("%d\n",ans); else printf("Impossible\n"); } } return 0; }