G - Dungeon MasterBFS+填路

本文介绍了一个使用广度优先搜索(BFS)算法解决三维迷宫问题的C++实现案例。通过定义迷宫结构、节点移动规则及边界条件,实现了从起点到终点的有效路径寻找。文章展示了如何通过队列来迭代探索所有可能的路径,并记录到达每个位置所需的步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;


struct node   
{
int x,y,z;
};    


queue <node> qq;


char map[35][35][35];  
int track[35][35][35]; 


int l,r,c;


int start[1][5];
int end[1][5];




int main()
{
void bfs();
while(scanf("%d%d%d",&l,&r,&c)!=EOF)
{
while(!qq.empty())  //之前没这个导致WA
qq.pop();


getchar(); 
memset(track,0,sizeof(track));
memset(map,0,sizeof(map));
if (!l && !r && !c) break;

int i,j,k;

for (i=1;i<=l;i++)
{
for (j=1;j<=r;j++)
{
for (k=1;k<=c;k++)
{
scanf("%c",&map[i][j][k]);
if (map[i][j][k]=='S') 
{
start[0][1]=i;
start[0][2]=j;
start[0][3]=k;
}
if (map[i][j][k]=='E') 
{
end[0][1]=i;
end[0][2]=j;
end[0][3]=k;
}

}
getchar();

 if (i<l) getchar();
}

node a;
a.z=start[0][1];
a.x=start[0][2];
a.y=start[0][3];

qq.push(a);
bfs();





}
                                                       
 
return 0;

}






int legal(int zz, int rr,int cc)

int ok=0;
 
if   ( rr>=1 && rr<=r && cc>=1 && cc<=c && zz>=1 && zz<=l  ) ok=1;
int ok1=0;
if ( map[zz][rr][cc]=='.'|| map[zz][rr][cc]=='E'  )  ok1=1;

if (ok1&&ok ) return 1;
return 0;
}




void bfs()
{
int ok=0;
while ( !qq.empty() )
{

node point=qq.front();
qq.pop();
 
if (point.z==end[0][1] && point.x==end[0][2] && point.y==end[0][3] )
{ok=1; break;   }

map[point.z][point.x][point.y]='#';

if ( legal(point.z,point.x-1,point.y)  )  
{
point.x--; 
qq.push(point); map[point.z][point.x][point.y]='#';  //之前没这个导致TLE
point.x++;
track[point.z][point.x-1][point.y]=track[point.z][point.x][point.y]+1;    
}

 


if ( legal(point.z,point.x+1,point.y)  ) 
{
point.x++; 
qq.push(point); map[point.z][point.x][point.y]='#';//之前没这个导致TLE
point.x--;
track[point.z][point.x+1][point.y]=track[point.z][point.x][point.y]+1;
}

if ( legal(point.z,point.x,point.y-1)  )  
{
point.y--; 
qq.push(point); map[point.z][point.x][point.y]='#';//之前没这个导致TLE
point.y++;
track[point.z][point.x][point.y-1]=track[point.z][point.x][point.y]+1;


if ( legal(point.z,point.x,point.y+1)  ) 
{
point.y++;
qq.push(point); map[point.z][point.x][point.y]='#';
point.y--;
track[point.z][point.x][point.y+1]=track[point.z][point.x][point.y]+1;
}

if ( legal(point.z+1,point.x,point.y)  ) 
{
point.z++;
qq.push(point); map[point.z][point.x][point.y]='#';
point.z--;
track[point.z+1][point.x][point.y]=track[point.z][point.x][point.y]+1;
}
if ( legal(point.z-1,point.x,point.y)  ) 
{
point.z--;
qq.push(point); map[point.z][point.x][point.y]='#';
point.z++;
track[point.z-1][point.x][point.y]=track[point.z][point.x][point.y]+1;
}

}


if (ok)  printf("Escaped in %d minute(s).\n",track[end[0][1]][end[0][2]][end[0][3]]);
else
printf("Trapped!\n");
  return ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值