hdu12429(BFS+优先队列)

  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了

posted on 2012-08-16 15:38  矮人狙击手!  阅读(196)  评论(0编辑  收藏  举报

导航