hdu 1180诡异的楼梯(bfs)

来源:互联网 发布:9块9疯抢淘宝特卖 编辑:程序博客网 时间:2024/06/10 02:33

时间数组标记是否将遇到的位置进队列即可,应该用优先队列也是可以的,不过麻烦。

#include <iostream>#include <queue>#include <cstring>using namespace std;struct point{int x,y,step;}s,e;queue<point> q;int n,m,tim[25][25];char map[25][25];int h[4][2]={1,0,-1,0,0,1,0,-1};int BFS(){while(!q.empty()) q.pop();int i,j,xx,yy,shu; point t,tt;q.push(s);tim[s.x][s.y]=0;while(!q.empty()){t=q.front(); q.pop();for(i=0;i<4;i++){xx=t.x+h[i][0]; yy=t.y+h[i][1];if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*'){tt.step=t.step+1;if(map[xx][yy]=='|') {xx=xx+h[i][0]; yy=yy+h[i][1]; //对达楼梯对面 if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*') //楼梯前面还有路 {if(t.step%2!=0&&i<=1||t.step%2==0&&i>1)  tt.step+=1;if(tt.step<tim[xx][yy]){tt.x=xx; tt.y=yy; q.push(tt);tim[xx][yy]=tt.step;}} }else if(map[xx][yy]=='-'){xx=xx+h[i][0]; yy=yy+h[i][1]; //到达楼梯对面 if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*') //楼梯前面还有路 {if(t.step%2!=0&&i>1||t.step%2==0&&i<=1)  tt.step+=1;if(tt.step<tim[xx][yy]){tt.x=xx; tt.y=yy; q.push(tt);tim[xx][yy]=tt.step;}} }else {if(tt.step<tim[xx][yy]){tt.x=xx; tt.y=yy; q.push(tt);tim[xx][yy]=tt.step;}}}}}return tim[e.x][e.y];}int main(int argc, char *argv[]){int i,j;while(cin>>n>>m){for(i=0;i<n;i++)for(j=0;j<m;j++){cin>>map[i][j];if(map[i][j]=='S'){s.x=i; s.y=j; s.step=0; tim[i][j]=0;}else if(map[i][j]=='T'){e.x=i; e.y=j;}}memset(tim,0x33,sizeof(tim));cout<<BFS()<<endl;}return 0;}


 

原创粉丝点击