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 }
时间: 2024-10-11 17:44:46