您的位置:首页 > 其它

HDU 1180 诡异的楼梯(BFS+奇偶步数判断)

2015-09-07 18:32 405 查看

诡异的楼梯

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)

Total Submission(s): 11043 Accepted Submission(s): 2753



[align=left]Problem Description[/align]
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.

比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.

[align=left]Input[/align]
测试数据有多组,每组的表述如下:

第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.

[align=left]Output[/align]
只有一行,包含一个数T,表示到达目标的最短时间.

注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.

[align=left]Sample Input[/align]

5 5
**..T
**.*.
..|..
.*.*.
S....


[align=left]Sample Output[/align]

7

HintHint
地图如下:



[align=left]Source[/align]
Gardon-DYGG Contest 1

//分析:这题其实不难 但是又个坑 坑死我了!本题几乎都会想到bfs 但是一点就是遇到楼梯时过去那边的点也要判断,不然会出现楼梯来回跳
//还有就是标记一次就可以了 因为bfs可以枚举每一秒逐渐扩散 如果走过了 证明存在更快的走法 所以不走
//AC代码 没用优先队列
#include <iostream>
#include <cstdio>
#include <queue>
#include <string.h>
#include <string>
using namespace std;
const int N=20+5;
int step[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
//               0上    1下   2左    3右
char map

;
bool book

;
int n,m;
struct Node{
int x,y,sum;
}tmp,node;
queue<Node> q;
int main(){
int i,j;
char c
;
bool ok;
while(scanf("%d%d",&n,&m)==2){
while(!q.empty()) q.pop();
for(i=0;i<n;i++){
scanf("%s",map[i]);
for(j=0;j<m;j++)
{
book[i][j]=0;
if(map[i][j]=='S'){
node.x=i;
node.y=j;
node.sum=0;
book[i][j]=1;
}
}
}
q.push(node);
while(!q.empty()){
node=q.front();
//  printf("%d %d %d\n",node.x, node.y,node.sum);
q.pop();
if(map[node.x][node.y]=='T')
break;
for(i=0;i<4;i++){
int a=node.x+step[i][0];
int b=node.y+step[i][1];
if(a<0||a>=n||b<0||b>=m||book[a][b]==1||map[a][b]=='*')
continue;
if(map[a][b]=='|'){
if((i<=1&&(node.sum)%2==0)||
(i>=2&&(node.sum)%2==1))
{
a=a+step[i][0];
b=b+step[i][1];
//判断梯子对面走过没  (重点  坑死我了)
if(a<0||a>=n||b<0||b>=m||book[a][b]==1||map[a][b]=='*')
continue;
tmp.x=a;
tmp.y=b;
tmp.sum=node.sum+1;
}
else
{
tmp.sum=node.sum+1;
tmp.x=node.x;
tmp.y=node.y;
}
}
else if(map[a][b]=='-'){
if((i<=1&&(node.sum)%2==1)
||(i>=2&&(node.sum)%2==0)){
a=a+step[i][0];
b=b+step[i][1];
//判断梯子对面走过没  (重点  坑死我了)
if(a<0||a>=n||b<0||b>=m||book[a][b]==1||map[a][b]=='*')
continue;
tmp.x=a;
tmp.y=b;
tmp.sum=node.sum+1;
}
else
{
tmp.sum=node.sum+1;
tmp.x=node.x;
tmp.y=node.y;
}
}
else{
tmp.x=a;
tmp.y=b;
tmp.sum=node.sum+1;
}
book[tmp.x][tmp.y]=1;
q.push(tmp);
}
}
printf("%d\n",node.sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: