标签:
要注意,虽然楼梯有时不能过,但是我们可以在楼梯前等一下,等到楼梯达到我们需要的状态时再过,其实不用优先队列也是可以的.具体自己去想吧.好久没写这么长的代码了
#include<iostream> #include<queue> #include<cstring> int m,n; int tx,ty,sx,sy; char mapp[21][21]; int visit[21][21]; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; struct stu { int x,y,t; }; using namespace std; void bfs() { queue<stu>root; stu x,y; x.x=sx;x.y=sy;x.t=0; root.push(x); visit[x.x][x.y]=1; while(root.size()) { x=root.front(); //cout<<x.x<<' '<<x.y<<endl; root.pop(); if(mapp[x.x][x.y]=='T'){cout<<x.t<<endl;return;} if(x.x+1>=0&&x.x+1<m&&visit[x.x+1][x.y]==0) { y.x=x.x+1;y.y=x.y;y.t=x.t+1; if(mapp[y.x][y.y]=='.'||mapp[y.x][y.y]=='T') root.push(y),visit[y.x][y.y]=1; else if((mapp[y.x][y.y]=='|'&&(y.t-1)%2==0)||(mapp[y.x][y.y]=='-')&&(y.t-1)%2==1) { y.x++; if(y.x+1>=0&&y.x<m&&visit[y.x][y.y]==0) root.push(y),visit[y.x][y.y]=1,y.x--; } else if(mapp[y.x][y.y]!='*') { y.x=x.x;y.y=x.y;y.t=x.t+1; root.push(y); } } if(x.x-1>=0&&x.x-1<m&&visit[x.x-1][x.y]==0) { y.x=x.x-1;y.y=x.y;y.t=x.t+1; if(mapp[y.x][y.y]=='.'||mapp[y.x][y.y]=='T') root.push(y),visit[y.x][y.y]=1; else if((mapp[y.x][y.y]=='|'&&(y.t-1)%2==0)||(mapp[y.x][y.y]=='-'&&(y.t-1)%2==1)) { y.x--; if(y.x>=0&&y.x<m&&visit[y.x][y.y]==0) root.push(y),visit[y.x][y.y]=1,y.x++; } else if(mapp[y.x][y.y]!='*') { y.x=x.x;y.y=x.y;y.t=x.t+1; root.push(y); } } if(x.y-1>=0&&x.y-1<n&&visit[x.x][x.y-1]==0) { y.x=x.x;y.y=x.y-1;y.t=x.t+1; if(mapp[y.x][y.y]=='.'||mapp[y.x][y.y]=='T') root.push(y),visit[y.x][y.y]=1; else if((mapp[y.x][y.y]=='-'&&(y.t-1)%2==0)||(mapp[y.x][y.y]=='|'&&(y.t-1)%2==1)) { y.y--; if(y.y>=0&&y.y<n&&visit[y.x][y.y]==0) root.push(y),visit[y.x][y.y]=1,y.y++; } else if(mapp[y.x][y.y]!='*') { y.x=x.x;y.y=x.y;y.t=x.t+1; root.push(y); } } if(x.y+1>=0&&x.y+1<n&&visit[x.x][x.y+1]==0) { y.x=x.x;y.y=x.y+1;y.t=x.t+1; if(mapp[y.x][y.y]=='.'||mapp[y.x][y.y]=='T') root.push(y),visit[y.x][y.y]=1; else if((mapp[y.x][y.y]=='-'&&(y.t-1)%2==0)||(mapp[y.x][y.y]=='|'&&(y.t-1)%2==1)) { y.y++; if(y.y>=0&&y.y<n&&visit[y.x][y.y]==0) root.push(y),visit[y.x][y.y]=1,y.y--; } else if(mapp[y.x][y.y]!='*') { y.x=x.x;y.y=x.y;y.t=x.t+1; root.push(y); } } } } int main() { while(cin>>m>>n) { if(m==0&&n==0){cout<<0<<endl;} for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { cin>>mapp[i][j]; if(mapp[i][j]=='T') tx=i,ty=j; if(mapp[i][j]=='S') sx=i,sy=j; } } memset(visit,0,sizeof(visit)); bfs(); } return 0; }
标签:
原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/44946921