题意:给定起点和终点,算时间。
注意:判断扩展的点为'|'或者'-'时,到达此点楼梯的状态。
本来能有优先队列做的,我犯贱咯!等一天补上优先队列的代码;
连接:http://acm.hdu.edu.cn/showproblem.php?pid=1180
View Code
#include <iostream> using namespace std; #include <queue> const int MAX = 20+10; char map[MAX][MAX]; //bool used[MAX][MAX]; int starti,startj,n,m; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; struct node { int i; int j; int sum; }; int bfs() { queue<node>q; node flag; flag.i=starti; flag.j=startj; flag.sum=0; q.push(flag); map[flag.i][flag.j]='*'; while(!q.empty()) { flag=q.front(); q.pop(); for(int i=0;i<4;i++) { node temp; temp=flag; temp.i+=dir[i][0]; temp.j+=dir[i][1]; if(map[temp.i][temp.j]!='*') { if(map[temp.i][temp.j]=='T') { temp.sum++; return temp.sum; } if(map[temp.i][temp.j]=='.') { temp.sum=flag.sum+1;; map[temp.i][temp.j]='*'; q.push(temp); } if(map[temp.i][temp.j]=='|') { if((dir[i][0]==0&&dir[i][1]==1)||(dir[i][0]==0&&dir[i][1]==-1))//更新的点为|且可以走,就直接走楼梯。从上到下,或者从下向上走 { if(flag.sum%2==1) { if((map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='.')||map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T') { if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T') { temp.sum++; return temp.sum; } temp.i+=dir[i][0]; temp.j+=dir[i][1]; temp.sum=flag.sum+1; map[temp.i][temp.j]='*'; q.push(temp); } else continue;// } else //更新的点为|且不可以走,即从上到下,或者从下向上走,就直接把自己入队。 { temp.i-=dir[i][0]; temp.j-=dir[i][1]; temp.sum=flag.sum+1; map[temp.i][temp.j]='*'; q.push(temp); } } if((dir[i][0]==1&&dir[i][1]==0)||(dir[i][0]==-1&&dir[i][1]==0)) { if(flag.sum%2==0) { if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='.'||map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')//更新的点为|且可以走,就直接走楼梯。//更新的点为|且可以走,就直接走楼梯。从右到左,或者从左向右走 { if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T') { temp.sum++; return temp.sum; } temp.i+=dir[i][0]; temp.j+=dir[i][1]; temp.sum=flag.sum+1; map[temp.i][temp.j]='*'; q.push(temp); } else continue;// } else //更新的点为|且不可以走,就直接把自己入队。//更新的点为|且可以走,就直接走楼梯。从左到右,或者从右向上左 { temp.i-=dir[i][0]; temp.j-=dir[i][1]; temp.sum=flag.sum+1; map[temp.i][temp.j]='*'; q.push(temp); } } } if(map[temp.i][temp.j]=='-') { if((dir[i][0]==0&&dir[i][1]==1)||(dir[i][0]==0&&dir[i][1]==-1)) { if(flag.sum%2==0){ if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='.'||map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')//更新的点为-且可以走,就直接走楼梯。从上到下,或者从下向上走 { if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T') { temp.sum++; return temp.sum; } temp.i+=dir[i][0]; temp.j+=dir[i][1]; temp.sum=flag.sum+1; map[temp.i][temp.j]='*'; q.push(temp); } else continue;// } else //更新的点为-且不可以走,就直接走楼梯。从上到下,或者从下向上走 { temp.i-=dir[i][0]; temp.j-=dir[i][1]; temp.sum=flag.sum+1; map[temp.i][temp.j]='*'; q.push(temp); } } if((dir[i][0]==1&&dir[i][1]==0)||(dir[i][0]==-1&&dir[i][1]==0)) { if(flag.sum%2==1) { if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='.'||map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T')//更新的点为-且可以走,就直接走楼梯。从左到右,或者从右向左走 { if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]=='T') { temp.sum++; return temp.sum; } temp.i+=dir[i][0]; temp.j+=dir[i][1]; temp.sum=flag.sum+1; map[temp.i][temp.j]='*'; q.push(temp); } else continue;// } else //更新的点为-且可以走,就直接走楼梯。从左到右,或者从右向左走 { temp.i-=dir[i][0]; temp.j-=dir[i][1]; temp.sum=flag.sum+1; map[temp.i][temp.j]='*'; q.push(temp); } } } } } } return 0; } int main() { while(~scanf("%d%d",&n,&m)) { getchar(); memset(map,'*',sizeof(map)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='S') { starti=i; startj=j; } } getchar(); } printf("%d\n",bfs()); } return 0; }