这道题的关键就是处理好'x'。因此,我们用类似于DP的思想,定义一个dist[][]数组,来保存各个点到起点的最短路。每次有新点出队列的时候,对其旁边的四个点进行更新。并对未入队的点进行push操作。 #include<stdio.h> #include<string.h> #define max 205 #define maxcost 100000 int n,m,step; int used[max][max]; char map[max][max]; int ax,ay,rx,ry; struct node { int x,y; }; struct node queue[max],temp,position; int dist[max][max]; int dir[][2]={{-1,0},{1,0},{0,-1},{0,1}}; void bfs(int rx,int ry) { int i,j,front=0,rear=0; for(i=0;i<n;i++) for(j=0;j<m;j++) { used[i][j]=0; dist[i][j]=maxcost; } used[rx][ry]=1; dist[rx][ry]=0; rear++; queue[rear].x=rx;queue[rear].y=ry; while(rear!=front) { front++; position=queue[front]; for(i=0;i<4;i++) { temp.x=position.x+dir[i][0]; temp.y=position.y+dir[i][1]; if(map[temp.x][temp.y]!='#'&&temp.x>=0&&temp.x<n&&temp.y>=0&&temp.y<m) { if(map[temp.x][temp.y]=='.'||map[temp.x][temp.y]=='a') { if(dist[position.x][position.y]+1<dist[temp.x][temp.y]) dist[temp.x][temp.y]=dist[position.x][position.y]+1; } else if(map[temp.x][temp.y]=='x') { if(dist[position.x][position.y]+2<dist[temp.x][temp.y]) dist[temp.x][temp.y]=dist[position.x][position.y]+2; } if(used[temp.x][temp.y]==0) { rear++; queue[rear].x=temp.x;queue[rear].y=temp.y; used[temp.x][temp.y]=1; } } } } } main() { int i,j; while(scanf("%d%d",&n,&m)!=EOF) { int l=0; memset(used,0,sizeof(used)); for(i=0;i<n;i++) scanf("%s",&map[i]); for(i=0;i<n;i++) for(j=0;j<m;j++) { if(map[i][j]=='r') { rx=i;ry=j; } else if(map[i][j]=='a') { ax=i;ay=j; } } bfs(rx,ry); if(dist[ax][ay]!=maxcost) printf("%d/n",dist[ax][ay]); else printf("Poor ANGEL has to stay in the prison all his life./n"); } }