您的位置:首页 > 其它

POJ 2251 (三维迷宫问题) DFS /BFS

2009-10-09 09:52 423 查看
这道题开始时用DFS做的,超时了,这也是意料之中的。后来改用BFS做AC。

这道题时最基本的典型的搜索问题,通过DFS能够找到一个路径,但是不能保证是最优的,需要回溯搜索才能找到最优。通过BFS就能够找到一个最优解(如果存在),符合标准的BFS搜索。这里记录下来就为了作为搜索题的基础,以后能有所进步。

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int l,r,c;
char g[31][31][31];
int shift[6][3]={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}};
short flag[31][31][31];
int s[3];
int e[3];
int min_path=0xffff;
struct Point
{
int x;
int y;
int z;
int step;
};
queue<Point> mq;
bool inrange(int x,int y,int z)
{
if(x>=0 && x<l && y>=0 && y<r && z>=0 && z<c)
return true;
else
return false;
}
void dfs(int x,int y,int z)
{
int i ,j,k;
//如果当前“位置”已经在当前路径上(flag[x][y][z]==1)或者当前“位置不可达”,或者当前位置越界,回溯
if( !inrange(x,y,z) || g[x][y][z]=='#' || flag[x][y][z]==1)
return;
else if(x==e[0] && y == e[1] && z==e[2])
{
if(min_path>step)
min_path=step;
return;
}
for(i=0;i<6;i++)
{
int x1=x+shift[i][0];
int y1=y+shift[i][1];
int z1=z+shift[i][2];
flag[x][y][z]=1;
step++;
dfs(x1,y1,z1);
flag[x][y][z]=0;
step--;
}
}
void bfs(int x,int y,int z)
{
Point p;
p.x=x;
p.y=y;
p.z=z;
p.step=0;
flag[x][y][z]=1;
mq.push(p);
while(!mq.empty())
{
Point q = mq.front();
mq.pop();

if(q.x==e[0] && q.y==e[1] && q.z==e[2])
{
min_path = q.step;
return;
}
for(int i=0;i<6;i++)
{
Point m;
m.x= q.x+shift[i][0];
m.y= q.y+shift[i][1];
m.z= q.z+shift[i][2];
m.step =q.step+1;
if(inrange(m.x,m.y,m.z) && g[m.x][m.y][m.z]!='#'  && flag[m.x][m.y][m.z]==0)
{
flag[m.x][m.y][m.z]=1;
mq.push(m);
}
}
}
}
int main()
{
cin>>l;
cin>>r;
cin>>c;
int i,j,k;
while(l || r || c)
{
min_path=0xffff;
memset(g,0,sizeof(g));
memset(flag,0,sizeof(flag));
while(!mq.empty())
{
mq.pop();
}
for(i=0;i<l;i++)
{
for(j=0;j<r;j++)
{
getchar();
for(k=0;k<c;k++)
{
g[i][j][k]=getchar();
if(g[i][j][k]=='S')
{
s[0]=i;
s[1]=j;
s[2]=k;
}
if(g[i][j][k]=='E')
{
e[0]=i;
e[1]=j;
e[2]=k;
}
}
}
getchar();
}
bfs(s[0],s[1],s[2]);
if(min_path<0xffff)
cout<<"Escaped in "<<min_path<<" minute(s)."<<endl;
else
cout<<"Trapped!"<<endl;
cin>>l;
cin>>r;
cin>>c;
}

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