hdu 1180 诡异的楼梯
2014-08-26 18:04
417 查看
hdu 1180 诡异的楼梯
楼梯诡异是因为楼梯每一分钟它都会变换方向 竖直方向与水平方向轮流交换
找优先队列的题找到这题的 所以就会往优先队列的方向去向 显然就是以走过的步数作为排序的条件
这题中跨越梯子的那步是不算的 而且可以在原地等一步梯子转到自己要走的方向 所以在遇到梯子的时候就需要进行判断 然后跨越梯子之后判断有木有到达终点
这题中n m值与常规遇到的不一样。。。。
代码如下:
楼梯诡异是因为楼梯每一分钟它都会变换方向 竖直方向与水平方向轮流交换
找优先队列的题找到这题的 所以就会往优先队列的方向去向 显然就是以走过的步数作为排序的条件
这题中跨越梯子的那步是不算的 而且可以在原地等一步梯子转到自己要走的方向 所以在遇到梯子的时候就需要进行判断 然后跨越梯子之后判断有木有到达终点
这题中n m值与常规遇到的不一样。。。。
代码如下:
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <string.h> #include <string> #include <queue> #define eps 1e-8 #define op operator #define MOD 10009 #define MAXN 100100 #define FOR(i,a,b) for(int i=a;i<=b;i++) #define FOV(i,a,b) for(int i=a;i>=b;i--) #define REP(i,a,b) for(int i=a;i<b;i++) #define REV(i,a,b) for(int i=a-1;i>=b;i--) #define MEM(a,x) memset(a,x,sizeof a) #define ll __int64 using namespace std; struct node { int x,y; int step; bool operator <(const node p)const { return step>p.step; } }; int m,n; node p,q; char map[25][25]; int vis [25][25]; int sx,sy,tx,ty; int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; int check(int x,int y,int t,int d) { if(t%2==0) { if(map[x][y]=='|') { if(d==0||d==1) t++; } else { if(d==2||d==3) t++; } } else { if(map[x][y]=='-') { if(d==0||d==1) t++; } else { if(d==2||d==3) t++; } } return t+1; } void bfs() { priority_queue<node> Q; p.x=sx; p.y=sy; p.step=0; Q.push(p); while(!Q.empty()) { p=Q.top(); Q.pop(); if(p.x==tx&&p.y==ty) { printf("%d\n",p.step); return; } for(int i=0;i<4;i++) { q.x=p.x+dir[i][0]; q.y=p.y+dir[i][1]; q.step=p.step; if(q.x>=0&&q.x<m&&q.y>=0&&q.y<n&&!vis[q.x][q.y]&&map[q.x][q.y]!='*') { if(map[q.x][q.y]=='.'||map[q.x][q.y]=='T') { q.step++; vis[q.x][q.y]=1; if(q.x==tx&&q.y==ty) { printf("%d\n",q.step); return; } Q.push(q); } if(map[q.x][q.y]=='|'||map[q.x][q.y]=='-') { int num,xx,yy; num=check(q.x,q.y,q.step,i); // q.step=num; xx=q.x+dir[i][0]; yy=q.y+dir[i][1]; if(xx>=0&&xx<m&&yy>=0&&yy<n&&!vis[xx][yy]&&map[xx][yy]!='*') { q.x=xx; q.y=yy; q.step=num; vis[q.x][q.y]=1; // Q.push(q); if(q.x==tx&&q.y==ty) { printf("%d\n",q.step); return; } Q.push(q); } } } } } } int main() { //freopen("ceshi.txt","r",stdin); while(scanf("%d%d",&m,&n)!=EOF) { for(int i=0;i<m;i++) { scanf("%s",map[i]); for(int j=0;j<n;j++) { if(map[i][j]=='S') { sx=i; sy=j; } if(map[i][j]=='T') { tx=i; ty=j; } } } MEM(vis,0); bfs(); } return 0; }
相关文章推荐
- HDU 1180 诡异的楼梯
- hdu 1180 诡异的楼梯
- HDU1180——诡异的楼梯(BFS+优先队列)
- HDU 1180 诡异楼梯 bfs
- HDU 1180 诡异的楼梯(搜索 -- BFS)
- HDU 1180诡异的楼梯
- HDU【1180】诡异的楼梯
- hdu 1180 诡异的楼梯
- HDU 1180 诡异的楼梯(广搜)
- hdu 1180 诡异的楼梯 bfs+优先队列 解题报告
- hdu - 1180 诡异的楼梯 (bfs+优先队列)
- hdu 1180(广搜升阶)诡异的楼梯
- 【BFS&&优先队列】HDU 1180 诡异的楼梯
- hdu1180-诡异的楼梯(bfs+优先队列)
- hdu 1180诡异的楼梯
- HDU 1180 诡异的楼梯
- HDU--杭电--1180--诡异的楼梯--广搜--蛋疼的流氓讲师今天弄完了这楼梯,想说的是理清思路就好,这题原来这么水
- hdu1180 诡异的楼梯(BFS+优先队列)
- HDU1180 诡异楼梯
- HDOJ/HDU 1180 诡异的楼梯(经典BFS-详解)