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 ",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 ",s.x,s.y); 69 flag=0; 70 field[s.x][s.y]='#'; 71 bfs(s); 72 if(flag) printf("%d ",time); 73 else printf("Poor ANGEL has to stay in the prison all his life. "); 74 } 75 }
http://acm.hdu.edu.cn/showproblem.php?pid=2425
这题是给定了起始点和目标点,让你求起始点到目标点的最少花费。总共有3种点,每一种点的花费都不同。跟上面那体没有很大区别。
这题简直悲剧,提交错了5,6次,就是一点小错误还害得我对拍了很多次。以后一定要细心。
判断到达目标点的时候不要再循环里面判断,可能出错。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 struct maze 6 { 7 int x,y,cost; 8 bool operator < (const maze a) const 9 { 10 return cost>a.cost; 11 } 12 }; 13 int r,c; 14 int vp,vs,vt; 15 int sr,sc,tr,tc; 16 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 17 char field[100][100]; 18 int bfs() 19 { 20 priority_queue<maze>que; 21 maze s; 22 s.x=sr;s.y=sc;s.cost=0; 23 field[s.x][s.y]='@'; 24 que.push(s); 25 while(!que.empty()) 26 { 27 maze e=que.top(); 28 que.pop(); 29 // printf("%d %d %d ",s.x,s.y,s.cost); 30 if(e.x==tr&&e.y==tc) return e.cost; 31 for(int i=0;i<4;i++) 32 { 33 s=e; 34 s.x=e.x+dir[i][0]; 35 s.y=e.y+dir[i][1]; 36 if(s.x<0||s.x>=r||s.y<0||s.y>=c||field[s.x][s.y]=='@') continue; 37 if(field[s.x][s.y]=='#') s.cost+=vp; 38 else if(field[s.x][s.y]=='.') s.cost+=vs; 39 else if(field[s.x][s.y]=='T') s.cost+=vt; 40 field[s.x][s.y]='@'; 41 que.push(s); 42 } 43 } 44 return -1; 45 } 46 int main() 47 { 48 //freopen("data.txt","r",stdin); 49 //freopen("b.txt","w",stdout); 50 int j=1; 51 while(~scanf("%d%d",&r,&c)) 52 { 53 //printf("%d %d ",r,c); 54 scanf("%d%d%d",&vp,&vs,&vt); 55 //printf("%d %d %d ",vr,vs,vt); 56 getchar(); 57 for(int i=0;i<r;i++) scanf("%s",field[i]); 58 scanf("%d%d%d%d",&sr,&sc,&tr,&tc); 59 printf("Case %d: %d ",j++,bfs()); 60 } 61 return 0; 62 }