poj 2251 Dungeon Master

本文介绍了一种在三维空间中实现广度优先搜索(BFS)的算法,并提供了详细的C++代码实现。该算法适用于解决迷宫逃脱等问题,通过遍历三维网格来寻找从起点到终点的最短路径。

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

三维空间的广搜, 与二维一样处理,注意细节就可以

#include <cstdio>
int dx[] = {0, -1, 1, 0, 0, 0, 0};
int dy[] = {0, 0, 0, -1, 1, 0, 0};
int dz[] = {0, 0, 0, 0, 0, -1, 1};
const int inf = 99999999;
char maze[35][35][35], s[35];
int d[35][35][35], q[30000];
int l, r, c;
void bfs(int x, int y, int z)
{
  int front, rear, u;
  int ans =  inf;
  front = rear = 1;
  u = (z-1)*(r*c) + (x-1)*c + y;
  q[rear++] = u;
  d[z][x][y] = 0;
  while(front < rear)
   {
   	 u = q[front++];
   	 z = (u-1)/(r*c) + 1;
   	 u = (u-1)%(r*c) + 1;
   	 x = (u-1)/c + 1;
   	 y = (u-1)%c + 1;
   	 if(maze[z][x][y] == 'E')
   	   {
   	   	 ans = d[z][x][y];
   	   	 break;
   	   }
   	 for(int i=1; i<=6; i++)
   	   {
   	   	int nx = x + dx[i];
   	   	int ny = y + dy[i];
   	   	int nz = z + dz[i];
   	   	if(maze[nz][nx][ny] != '#' && d[nz][nx][ny] == inf)
   	   	  {
   	   	  	u = (nz-1)*(r*c) + (nx-1)*c + ny;
   	   	  	q[rear++] = u;
   	   	  	d[nz][nx][ny] = d[z][x][y] + 1;
   	   	  }
   	   }
   }
  if(ans == inf)
  	printf("Trapped!\n");
  else 
  	printf("Escaped in %d minute(s).\n", ans);
  return;
}
int main()
{
  while(scanf("%d %d %d",&l, &r, &c), l, r, c)
    { 
      getchar();
      int sx, sy, sz;
      for(int k=0; k<=l+1; k++)
      	for(int i=0; i<=r+1; i++)
      	  for(int j=0; j<=c+1; j++)
      	  	 {
      	  	 	d[k][i][j] = inf;
      	  	 	maze[k][i][j] = '#';
      	  	 }
      for(int k=1; k<=l; k++)
      	{
      	  for(int i=1; i<=r; i++)
      	    {
      	      scanf("%s", s);
      	      for(int j=1; j<=c; j++)
      	      	{
      	      	  maze[k][i][j] = s[j-1];
      	      	  if(s[j-1] == 'S')
      	      	    {
      	      	      sx = i; 
      	      	      sy = j;
      	      	      sz = k;
      	      	    }
      	      	}
      	    }
      	  getchar();
      	}
     bfs(sx, sy, sz);
    }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值