给定一个3D迷宫判断走出去的最小步数....
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s). Trapped!
我的首个BFS题,感谢小杰的教导,谢谢他。。。!
解题思路:刚开始用深搜超时了,怎么优化都不行,后来才知道这个得用宽搜,哎菜啊。 学习了。。
BFS的代码
int queue[1000000],head,rear;
int pop(){ return queue[head++%1000000]; }
void push(int i) { queue[rear++%1000000]=i; }
int bfs(int i,int j,int k)
{
int num,x,y,z,fang;
while(head!=rear)
{
x=pop(); y=pop(); z=pop(); num=pop();
for(fang=0;fang<6;fang++)
if(x+mov[fang].x>-1&&x+mov[fang].x<L&&y+mov[fang].y>-1&&y+mov[fang].y<R&&z+mov[fang].z>-1&&z+mov[fang].z<C&&lock[x+mov[fang].x][y+mov[fang].y][z+mov[fang].z]==0&&(map[x+mov[fang].x][y+mov[fang].y][z+mov[fang].z]=='.'||map[x+mov[fang].x][y+mov[fang].y][z+mov[fang].z]=='E'))
{
if(map[x+mov[fang].x][y+mov[fang].y][z+mov[fang].z]=='E')
return num+1;
lock[x+mov[fang].x][y+mov[fang].y][z+mov[fang].z]=1;
push(x+mov[fang].x);
push(y+mov[fang].y);
push(z+mov[fang].z);
push(num+1);
}
}
return 0;
}
int main()
{
while(cin>>L>>R>>C&&L)
{
head=rear=0;
memset(lock,0,sizeof(lock));
int i,j,o,k;
for(i=0;i<L;i++)
for(j=0;j<R;j++)
scanf("%s",map[i][j]);
for(i=0;i<L;i++)
for(j=0;j<R;j++)
for(k=0;k<C;k++)
if(map[i][j][k]=='S')
goto start;
start: push(i); push(j); push(k); push(0);
o=bfs(i,j,k);
if(o) cout<<"Escaped in "<<o<<" minute(s)."<<endl;
else cout<<"Trapped!"<<endl;
}
return 0;
}
DFS超时的
int find(int i,int j,int k,int path)
{
if(path>=minp)
return 1;
if(map[i][j][k]=='E')
{
if(path<minp)
minp=path;
return 1;
}
int fang,flag=0;
for(fang=0;fang<6;fang++)
{
if(i+mov[fang].x>-1&&i+mov[fang].x<L&&j+mov[fang].y>-1&&j+mov[fang].y<R&&k+mov[fang].z>-1&&k+mov[fang].z<C&&way[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]==0&&(map[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]=='.'||map[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]=='E'))
{
way[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]=1;
if(find(i+mov[fang].x,j+mov[fang].y,k+mov[fang].z,path+1))
{ way[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]=0; flag=1; }
}
}
return flag;
}
int main()
{
int i,j,k,fang;
while(cin>>L>>R>>C&&(L||R||C))
{
minp=1000000;
memset(way,0,sizeof(way));
for(i=0;i<L;i++)
for(j=0;j<R;j++)
scanf("%s",map[i][j]);
for(i=0;i<L;i++)
for(j=0;j<R;j++)
for(k=0;k<C;k++)
if(map[i][j][k]=='S')
goto start;
start:
for(fang=0;fang<6;fang++)
{
if(i+mov[fang].x>-1&&i+mov[fang].x<L&&j+mov[fang].y>-1&&j+mov[fang].y<R&&k+mov[fang].z>-1&&k+mov[fang].z<C&&way[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]==0&&(map[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]=='.'||map[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]=='E'))
{
way[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]=1;
if(find(i+mov[fang].x,j+mov[fang].y,k+mov[fang].z,0))
way[i+mov[fang].x][j+mov[fang].y][k+mov[fang].z]=0;
}
}
if(minp>=1000000)
cout<<"Trapped!"<<endl;
else
cout<<"Escaped in "<<minp+1<<" minute(s)."<<endl;
}
return 0;
}