标签:
5 5 **..T **.*. ..|.. .*.*. S....
7地图如下:HintHint
/* 跟直接求最短路径有点不同的就是,他的梯子在方向不对的时候是不许通过的。 状态变化的就是人的位置。 对于梯子,可以有当可以通过时,让人穿越而过,即把梯子当做不耗时间,往同一方向再次移动一步。 用spfa就可以了。 */ #include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> #include <queue> #include <map> using namespace std; const int MAXN = 25; int n, m; int sx, sy, ex, ey; int fx[]={1,0,-1,0,1}; char ditu[MAXN][MAXN]; int pay[MAXN][MAXN]; void init() { for(int i=0; i<MAXN; i++) { for(int j=0; j<MAXN; j++) { ditu[i][j]='*'; } } memset(pay,-1,sizeof pay); } struct node { int x, y; int pay; }; void bfs() { node a, b; a.x = sx; a.y = sy; a.pay = 0; pay[a.x][a.y] = a.pay; queue<node>Q; Q.push(a); while(!Q.empty()) { a = Q.front(); Q.pop(); for(int i=0; i<4; i++) { b.x = a.x + fx[i]; b.y = a.y + fx[i+1]; b.pay = a.pay + 1; //墙不能走 if(ditu[b.x][b.y]=='*')continue; if(ditu[b.x][b.y]=='.') { if(pay[b.x][b.y] == -1 || pay[b.x][b.y] > b.pay) { pay[b.x][b.y] = b.pay; Q.push(b); } }else //if(ditu[b.x][b.y]=='|') { int flag = ditu[b.x][b.y]=='|'?0:1; //再走一步 b.x += fx[i]; b.y += fx[i+1]; //竖方向 if((flag+b.pay)%2==1) { //从左右走等一秒 if(i==1 || i==3) { b.pay++; } }else{//变"-"了 //从上下走等一秒 if(i==0 || i==2) { b.pay++; } } //地图中不会出现两个相连的梯子,只要考虑"."和"*"了,"."可走 if(ditu[b.x][b.y]=='.') { if(pay[b.x][b.y] == -1 || pay[b.x][b.y] > b.pay) { pay[b.x][b.y] = b.pay; Q.push(b); } } } } } } int main() { int i, j; while(cin>>n>>m) { init(); for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { cin>>ditu[i][j]; if(ditu[i][j]=='S') { sx = i; sy = j; ditu[i][j] = '.'; }else if(ditu[i][j]=='T') { ex = i; ey = j; ditu[i][j] = '.'; } } } bfs(); printf("%d\n",pay[ex][ey]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/fljssj/article/details/46916255