hdu 1180 诡异的楼梯

来源:互联网 发布:淘宝抢购编辑脚本 编辑:程序博客网 时间:2024/06/09 23:04

要注意,虽然楼梯有时不能过,但是我们可以在楼梯前等一下,等到楼梯达到我们需要的状态时再过,其实不用优先队列也是可以的.具体自己去想吧.好久没写这么长的代码了

#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;}


0 0