您的位置:首页 > 其它

poj 2251 Dungeon Master

2012-10-22 20:54 330 查看
1. 题意:有一个3维地牢,目前所处位置是‘S’,要想逃生,可以往东西南北上下六个方向走,‘#’代表不能通过,‘。’代表可以通过,求逃离到出口‘E’最短时间,走一步一分钟。

2. 思路:bfs简单搜素,注意三维空间处理,方向可处理为:int dir[6][3]= {{0,0,1},{0,-1,0},{1,0,0},{0,0,-1},{0,1,0},{-1,0,0}};

3. 注意:1.加入点时,要加入出口‘E’;

2.注意数组大小

4.代码:

#include<stdio.h>
#include<string.h>
char map[35][35][35];
int sx,sy,sz,ex,ey,ez;
int dir[6][3]= {{0,0,1},{0,-1,0},{1,0,0},{0,0,-1},{0,1,0},{-1,0,0}};
int visit[100][100][100];
struct node
{
int x;
int y;
int z;
int step;
} a[30000];//数组大小,最大点的个数
int bfs(int l,int r,int c)
{
int front=0;
int rear=1;
a[0].x=sx;
a[0].y=sy;
a[0].z=sz;
a[0].step=0;
node cur,change;
while(front<rear)
{
cur=a[front++];
//printf("%d%d%d\n",cur.x,cur.y,cur.z);
if(cur.x==ex&&cur.y==ey&&cur.z==ez)
return cur.step;
for(int i=0; i<6; i++)
{
int tx=cur.x+dir[i][0];
int ty=cur.y+dir[i][1];
int tz=cur.z+dir[i][2];
if(tx>=0&&tx<l&&ty>=0&&ty<r&&tz>=0&&tz<c&&visit[tx][ty][tz]==0&&(map[tx][ty][tz]=='.'||map[tx][ty][tz]=='E'))//注:加入E点
{
visit[tx][ty][tz]=1;
change.x=tx;
change.y=ty;
change.z=tz;
change.step=cur.step+1;
a[rear++]=change;
}
}
}
return -1;
}
int main()
{
int l,r,c;
while(scanf("%d%d%d",&l,&r,&c)!=EOF)
{
memset(visit,0,sizeof(visit));
if(l==0&&r==0&&c==0)
break;
for(int i=0; i<l; i++)
{
for(int j=0; j<r; j++)
{
scanf("%s",map[i][j]);
//printf("%s\n",map[i][j]);
for(int k=0; k<c; k++)
{
if(map[i][j][k]=='S')
{
sx=i;
sy=j;
sz=k;
}
if(map[i][j][k]=='E')
{
ex=i;
ey=j;
ez=k;
}
}
}

}
int ans=bfs(l,r,c);
if(ans==-1)
printf("Trapped!\n");
else printf("Escaped in %d minute(s).\n",ans);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: