码迷,mamicode.com
首页 > 其他好文 > 详细

hdu - 1242 Rescue (优先队列+bfs)

时间:2015-05-23 11:14:40      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

http://acm.hdu.edu.cn/showproblem.php?pid=1242

感觉题目没有表述清楚,angel的朋友应该不一定只有一个,那么正解就是a去搜索r,再用普通的bfs就能过了。

但是别人说要用优先队列来保证时间最优,我倒是没明白,步数最优跟时间最优不是等价的吗?就算士兵要花费额外时间,可是既然先到了目标点那时间不也一定是最小的?

当然用优先队列+ a去搜索r是最稳妥的。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <iostream>
 5 using namespace std;
 6 
 7 struct maze
 8 {
 9     int x,y,t;
10     bool operator < (const maze a) const
11     {
12         return t>a.t;
13     }
14 };
15 int n,m,time;
16 bool flag;
17 char field[210][210];
18 int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
19 void bfs(maze s)
20 {
21     priority_queue<maze>que;
22     que.push(s);
23     while(!que.empty())
24     {
25         maze e=que.top();
26         que.pop();
27         for(int i=0;i<4;i++)
28         {
29             s.x=e.x+dir[i][0];
30             s.y=e.y+dir[i][1];
31             s.t=e.t+1;
32             if(s.x>=0&&s.x<n&&s.y>=0&&s.y<m&&field[s.x][s.y]!=#)
33             {
34                 if(field[s.x][s.y]==r)
35                 {
36                     flag=1;time=s.t;return;
37                 }
38                 else if(field[s.x][s.y]==x) s.t++;
39 
40                 //printf("%d %d %d\n",s.x,s.y,s.t);
41                 field[s.x][s.y]=#;
42                 que.push(s);
43             }
44         }
45     }
46 }
47 
48 int main()
49 {
50     //freopen("a.txt","r",stdin);
51     maze s;
52     while(~scanf("%d%d",&n,&m))
53     {
54         getchar();
55         for(int i=0;i<n;i++)
56         {
57             scanf("%s",field[i]);
58             for(int j=0;j<m;j++)
59             {
60                 if(field[i][j]==a)
61                 {
62                     s.x=i;
63                     s.y=j;
64                     s.t=0;
65                 }
66             }
67         }
68         //printf("%d %d\n",s.x,s.y);
69         flag=0;
70         field[s.x][s.y]=#;
71         bfs(s);
72         if(flag) printf("%d\n",time);
73         else printf("Poor ANGEL has to stay in the prison all his life.\n");
74     }
75 }

hdu - 1242 Rescue (优先队列+bfs)

标签:

原文地址:http://www.cnblogs.com/nowandforever/p/4523729.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!