hdu1180诡异的楼梯(bfs)
2016-10-02 15:49
423 查看
这道题的意思是哈利波特要从S走到T,中间有那种会改变方向的楼梯,经过楼梯的话一共只用一秒,但是可能会存在有特殊的楼梯会一秒改变一次方向,也就是说可能会等一秒,不会有两个楼梯连续挨着,还有很重要的一点就是,你不能再楼梯上呆一秒,所以当你找到楼梯的时候,不能把他直接压进队列,要直接对它进行处理,然后把处理过的压进队列,这点一定要切记,再者就是在遇到楼梯的时候,先用步数的奇偶来判断此时楼梯的方向,然后看此时自己的方向和楼梯的方向是否为同一个方向,然后就很好操作了
#include <iostream> #include <string.h> #include <queue> using namespace std; char s[30][30]; bool vis[30][30]; int dir[30][30]; int xx[4][2]= {{0,-1},{0,1},{1,0},{-1,0}}; struct sa { int x,y,step; friend bool operator<(sa a,sa b) { return a.step>b.step; } } a,p,t; priority_queue<sa>q; int m,n; int solve() { while(!q.empty()) { sa a=q.top(); q.pop(); for(int i=0; i<4; i++) { int nx=a.x+xx[i][0]; int ny=a.y+xx[i][1]; if(nx>=0&&nx<m&&ny>=0&&ny<n) { char c; if(s[nx][ny]=='T') return a.step+1; else if(s[nx][ny]=='.'&&!vis[nx][ny]) { p.x=nx; p.y=ny; p.step=a.step+1; vis[nx][ny]=1; q.push(p); } else if(s[nx][ny]=='|'||s[nx][ny]=='-') { if(a.step%2==1) { if(s[nx][ny]=='-') c='|'; else if(s[nx][ny]=='|') c='-'; } else c=s[nx][ny]; p.x=nx+xx[i][0]; p.y=ny+xx[i][1]; if(c=='|'&&(xx[i][1]==1||xx[i][1]==-1)) p.step=a.step+1; else if(c=='-'&&(xx[i][0]==1||xx[i][0]==-1)) p.step=a.step+1; else p.step=a.step; //vis[p.x][p.y]=1; /* cout<<c<<" "<<xx[i][0]<<" "<<xx[i][1]<<endl; cout<<a.step<<endl; cout<<p.step<<endl;*/ if(p.x>=0&&p.x<m&&p.y>=0&&p.y<n) { if(s[p.x][p.y]=='T') { return p.step+1; } else if(!vis[p.x][p.y]) { p.step+=1; vis[p.x][p.y]=1; q.push(p); } } } } } } return 0; } int main() { while(cin>>m>>n) { while(!q.empty()) q.pop(); memset(dir,0,sizeof(dir)); memset(s,0,sizeof(s)); memset(vis,0,sizeof(vis)); memset(s,0,sizeof(s)); for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { cin>>s[i][j]; if(s[i][j]=='S') { t.x=i; t.y=j; t.step=0; vis[i][j]=1; q.push(t); } if(s[i][j]=='|') dir[i][j]=1; if(s[i][j]=='-') dir[i][j]=-1; } } int ans=solve(); cout<<ans<<endl; } return 0; } /** 1 3 S|T */
相关文章推荐
- hdu 1180 诡异的楼梯(BFS)
- hdu1180——诡异的楼梯(优先队列+bfs)
- hdu 1180 诡异的楼梯(bfs)
- hdu1180 诡异的楼梯--BFS
- HDU-1180 诡异的楼梯(BFS)
- HDU1180-诡异的楼梯(bfs)
- HDU 1180 诡异的楼梯(BFS+保存自己的状态)
- 【BFS】HDU_1180_诡异的楼梯
- hdu1180 诡异的楼梯(优先队列bfs)
- HDU 1180 诡异的楼梯 BFS
- hdu1180 诡异的楼梯 --bfs+优先级队列
- hdu 1180 诡异的楼梯 bfs
- HDU_1180_诡异的楼梯_BFS
- 【HDU 1180】诡异的楼梯(BFS)
- 【BFS&&优先队列】HDU 1180 诡异的楼梯
- HDU1180 诡异的楼梯[bfs]
- HDU 1180 诡异楼梯 bfs
- HDU 1180 诡异的楼梯 bfs
- HDU 1180 诡异的楼梯(BFS)
- HDU 1180 诡异的楼梯 (BFS)