BFS+诡异的楼梯
来源:互联网 发布:淘宝棉麻女装 编辑:程序博客网 时间:2024/05/18 23:53
诡异的楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 6132 Accepted Submission(s): 1446
Problem Description
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
Input
测试数据有多组,每组的表述如下:
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
Output
只有一行,包含一个数T,表示到达目标的最短时间.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
Sample Input
5 5**..T**.*...|...*.*.S....
Sample Output
7地图如下:HintHint
Source
Gardon-DYGG Contest 1
#include<stdio.h> #include<stdlib.h>#include<string.h> const int MAX = 25 ; int vis[MAX][MAX] ; char map[MAX][MAX] ; int sx,sy,ex,ey,n,m; int d[4][2]={{1,0},{0,1},{-1,0},{0,-1}} ; struct Node{ int x,y,step ; } ; int inMap(int x,int y) { if(x>=0 && x<n && y>=0&&y<m) return 1; return 0; } int goStair(int x,int y ,int step ,int dic) //根据此时的步数可以判断可以知道楼梯此时的状态 { if(map[x][y] == '|') { if(step%2==0 && dic%2==0) return 1 ; else if(step%2 && dic%2) return 1 ; } else if(map[x][y] == '-') { if(step%2==0 && dic%2) return 1; else if(step%2 && dic%2 ==0) return 1; } return 0 ; } Node que[MAX*MAX+5] ; int bfs(int sx,int sy) { memset(vis, 0 ,sizeof(vis)) ; int head = 0 ,tail=1 ; que[head].x=sx ,que[head].y=sy ,que[head].step = 0; vis[sx][sy] = 1 ; while(head < tail) { int x = que[head].x , y = que[head].y , step = que[head].step ; head++ ; if(x == ex && y == ey) { return step ; } for(int i = 0 ; i < 4 ;i++) { int k=x+d[i][0],v=y+d[i][1] ; if(inMap(k,v) && !vis[k][v] && map[k][v]!='*') { if(map[k][v] == '.') { vis[k][v] = 1 ; que[tail].x = k ; que[tail].y = v ; que[tail].step = step+1 ; tail++ ; } else//如果遇到楼梯 { int a = k+d[i][0] , b = v+d[i][1] ; //楼梯对面的点没有访问过 if(inMap(a,b) && !vis[a][b] && map[a][b] != '*') { if(goStair(k,v,step,i)) //判断楼梯此时是否可走 { //如果可走则直接将该点放入队列,标记为已访问 vis[a][b] = 1; que[tail].x = a ; que[tail].y = b ; que[tail].step = step+1 ; tail++ ; } else { //如果此时楼梯不能走,则将此时所在的点放回队尾(等待) que[tail].x = x ; que[tail].y = y ; que[tail].step = step+1 ; tail++ ; } } } }//check if } } return -1 ; } int main() { while(~scanf("%d %d" ,&n ,&m)) { for(int i = 0 ; i < n ;i++) { scanf("%s" ,map[i]) ; for(int j = 0; j< m ;j++) if(map[i][j] == 'S') sx=i,sy=j,map[i][j]='.' ; else if(map[i][j] == 'T') ex=i,ey=j,map[i][j]='.'; } printf("%d\n",bfs(sx,sy)); } return 0; }
- BFS+诡异的楼梯
- HDU1180 诡异的楼梯--BFS
- hdu1180诡异的楼梯 bfs
- 诡异的楼梯(bfs)
- hdu1180诡异的楼梯(bfs)
- hdu1180 诡异的楼梯--BFS
- G - 诡异的楼梯 (bfs)
- HDU1180-诡异的楼梯(bfs)
- HDU1180 诡异的楼梯(BFS)
- 【BFS】HDU_1180_诡异的楼梯
- hdu 1180诡异的楼梯(bfs)
- hdu1180诡异的楼梯(BFS+优先队列)
- hdoj 1180 诡异的楼梯(BFS)
- 【搜索-BFS】HDU1180诡异的楼梯
- HDU 1180:诡异的楼梯(BFS)
- hdu 1180 诡异的楼梯(bfs)
- hdu 1180 诡异的楼梯 (bfs)
- 【Bfs】HDU 1180 诡异的楼梯
- Fuck MediaWiki (3) 用户权限管理
- NYOJ - 最大和(DP)
- IIS配置
- 汉诺塔问题
- 搜索引擎优化(其一)
- BFS+诡异的楼梯
- android取消EditText的焦点
- 工厂模式
- PHP根据浏览器跳转不同语言页面代码
- android 开机动画(boot animation)的制作
- 【Project】Need for Cube魔方比赛系统
- 黑马程序员_java多线程下
- 2013-4-13 日志
- 第四次上机实验