1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <queue> 5 #define Max 0x7f7f7f7f 6 using namespace std; 7 struct node 8 { 9 int x; 10 int y; 11 int time ; 12 friend bool operator < ( node a,node b) 13 { 14 return a.time>b.time;//开始错在这个地方了,感觉这里好怪啊,这个排序的东西我在单独写篇吧 15 } 16 }; 17 int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; 18 char map[205][205]; 19 int visited[205][205]; 20 int ans[205][205]; 21 int n,m; 22 23 void bfs(int x,int y) 24 { 25 memset(visited,0,sizeof(visited)); 26 memset(ans,Max,sizeof(ans)); 27 priority_queue <node> que; 28 node head,tail,tmp; 29 head.x=x; 30 head.y=y; 31 head.time=0; 32 que.push(head); 33 visited[x][y]=1; 34 ans[x][y]=0; 35 while(!que.empty()) 36 { 37 tmp=que.top(); 38 que.pop(); 39 if(map[tmp.x][tmp.y]=='r') 40 { 41 return ; 42 } 43 for(int i=0;i<4;i++) 44 { 45 tail.x=tmp.x+dir[i][0]; 46 tail.y=tmp.y+dir[i][1]; 47 if(visited[tail.x][tail.y]==0 && tail.x>=0 && tail.x<n &&tail.y>=0 &&tail.y<m && map[tail.x][tail.y]!='#') 48 { 49 if(map[tail.x][tail.y]=='x') 50 { 51 tail.time=tmp.time+2; 52 ans[tail.x][tail.y]=ans[tmp.x][tmp.y]+2; 53 } 54 else 55 { 56 tail.time=tmp.time+1; 57 ans[tail.x][tail.y]=ans[tmp.x][tmp.y]+1; 58 } 59 visited[tail.x][tail.y]=1; 60 que.push(tail); 61 } 62 } 63 } 64 65 66 } 67 68 int main() 69 { 70 71 char ch; 72 int x,y; 73 int i,j; 74 while(scanf("%d%d",&n,&m)!=EOF) 75 { 76 getchar(); 77 for(i=0;i<n;i++) 78 { 79 for(j=0;j<m;j++) 80 { 81 scanf("%c",&ch); 82 map[i][j]=ch; 83 if(ch=='a') 84 { 85 x=i; 86 y=j; 87 } 88 } 89 getchar(); 90 } 91 92 bfs(x,y); 93 int flag=0; 94 for(i=0;i<n;i++) 95 { 96 for(j=0;j<m;j++) 97 { 98 if(visited[i][j]==1 && map[i][j]=='r') 99 { 100 printf("%d\n",ans[i][j]); 101 flag=1; 102 break; 103 } 104 } 105 } 106 if(flag==0) 107 printf("Poor ANGEL has to stay in the prison all his life.\n"); 108 109 } 110 return 0; 111 }
我这里写的稍微有点复杂了,复杂在用了ans[][]来保存结果,其实不用这样,node 中的time已经保存了多要求的值了,所以改成 int bfs(),在适当的地方返回一个正确的值就ok了