2011-04-19 19:17:20 #include<iostream> #include<queue> using namespace std; struct Point { int x,y; }temp1,temp2; int a[][2]={{1,0},{-1,0},{0,1},{0,-1}}; int main() { char cmap[202][202]; int map[202][202],i,j,m,n,x,y,s; queue<Point> qp; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%s",cmap[i]+1); for(i=0;i<n+2;i++) { map[i][0]=-2; map[i][m+1]=-2; } for(j=0;j<m+2;j++) { map[0][j]=-2; map[n+1][j]=-2; } for (i=1;i<n+1;i++) for (j=1;j<m+1;j++) { if(cmap[i][j]=='#') map[i][j]=-2; else { map[i][j]=-1; if(cmap[i][j]=='r') { temp1.x=i; temp1.y=j; map[i][j]=0; } } } qp.push(temp1); while (!qp.empty()) { temp1=qp.front(); qp.pop(); if(cmap[temp1.x][temp1.y]=='a') break; s=map[temp1.x][temp1.y]+1; if(cmap[temp1.x][temp1.y]=='x') s++; for(i=0;i<4;i++) { x=temp1.x+a[i][0]; y=temp1.y+a[i][1]; if(map[x][y]==-1||map[x][y]>s) { if(map[x][y]==-1) { temp2.x=x;temp2.y=y; qp.push(temp2); } map[x][y]=s; } } } if(cmap[temp1.x][temp1.y]=='a') { printf("%d/n",map[temp1.x][temp1.y]); } else { printf("Impossible/n"); } return 0; }