hdu1180诡异的楼梯(BFS+优先队列)
来源:互联网 发布:和平网络电视 韩国 编辑:程序博客网 时间:2024/06/10 01:50
题目链接:hdu1180
/*思路:BFS+优先队列 每当遇到楼梯的时候, 1、如果能过 a、通过楼梯后不会超出边界,则走过楼梯 b、通过楼梯后超出边界,则该点不需再入队 2、如果不能通过,时间加1,此点继续入队,等待下一次楼梯变换方向*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <vector>#include <cstdlib>using namespace std;const int inf = 0x3f3f3f3f;const int N = 10010;int d[4][2] = {1,0,0,1,-1,0,0,-1};char a[25][25];int n,m,ans,sx,sy,ex,ey;bool v[25][25];struct node{ int x,y,step; bool operator <(const node &a) const{ return step > a.step; }};bool judge(int x, int y){ if(x < 0 || x >= n || y < 0 || y >= m || a[x][y] == '*') return false; return true;}void bfs(){ priority_queue<node> q; node s, tmp; s.x = sx; s.y = sy; s.step = 0; a[sx][sy] = '*'; q.push(s); while(!q.empty()) { tmp = q.top(); q.pop(); if(tmp.x == ex && tmp.y == ey){ printf("%d\n",tmp.step); return; } for(int i = 0; i < 4; i ++){ s.x = tmp.x + d[i][0]; s.y = tmp.y + d[i][1]; if(!judge(s.x, s.y)) continue; s.step = tmp.step+1; if(a[s.x][s.y] == '.'){ a[s.x][s.y] = '*'; q.push(s); } else if(a[s.x][s.y] == '|'){ if(((tmp.step&1) == (i&1))){//人走的方向和楼梯方向相同,可以通过楼梯 if(judge(s.x+d[i][0],s.y+d[i][1])){//楼梯的另一头不会超出边界范围 s.x += d[i][0]; s.y += d[i][1]; q.push(s); a[s.x][s.y] = a[tmp.x][tmp.y] = '*'; }//楼梯的另一头超出边界,此点不再入队 } else{//人走的方向和楼梯方向不同,停留在原地 node ss = tmp; ss.step ++;//时间加1 q.push(ss); } } else if(a[s.x][s.y] == '-'){ if(((tmp.step&1) != (i&1))){ if(judge(s.x+d[i][0],s.y+d[i][1])){ s.x += d[i][0]; s.y += d[i][1]; q.push(s); a[s.x][s.y] = a[tmp.x][tmp.y] = '*'; } } else{ node ss = tmp; ss.step ++; q.push(ss); } } } }}int main(){ int i,j; while(~scanf("%d%d",&n,&m)) { for(i = 0; i < n; i ++){ scanf("%s",&a[i]); for(j = 0; j < m; j ++){ if(a[i][j] == 'S') sx = i, sy = j; if(a[i][j] == 'T') ex = i, ey = j,a[i][j] = '.'; } } bfs(); } return 0;}
0 0
- hdu1180诡异的楼梯(BFS+优先队列)
- hdu1180-诡异的楼梯(bfs+优先队列)
- HDU1180——诡异的楼梯(BFS+优先队列)
- hdu1180 诡异的楼梯(BFS+优先队列)
- hdu1180 诡异的楼梯(优先队列bfs)
- HDU1180 诡异的楼梯(广搜BFS+优先队列)
- hdu1180——诡异的楼梯(优先队列+bfs)
- hdu1180 诡异的楼梯 --bfs+优先级队列
- HDU1180 诡异的楼梯--BFS
- hdu1180诡异的楼梯 bfs
- hdu1180诡异的楼梯(bfs)
- hdu1180 诡异的楼梯--BFS
- HDU1180-诡异的楼梯(bfs)
- HDU1180 诡异的楼梯(BFS)
- HDU1180 诡异的楼梯 广搜 优先队列
- hdu1180诡异的楼梯【优先队列+广搜】
- Hdu1180 - 诡异的楼梯 - 广度优先搜索
- 【搜索-BFS】HDU1180诡异的楼梯
- (转) 正试图在 os 加载程序锁内执行托管代码。不要尝试在DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
- 云推送的代码
- java 基础 流程控制
- POJ-2001 Shortest Prefixes
- [hdu 2015] 偶数求和
- hdu1180诡异的楼梯(BFS+优先队列)
- 字符串的反转
- ZOJ Problem Set - 3768 Continuous Login
- 在eclipse导入Java 的jar包的方法
- http://open.weibo.com/wiki/Oauth2/authorize 新浪登录接口
- Using Oracle Table Compression
- 传话游戏——编程之美热身赛
- OpenGIS Simple feature access
- nyoj-820-Wolf Game