搜索之广度优先【三维迷宫】(判断从一点能否到达另一点,最少走几步)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <queue>
#include<algorithm>
using namespace std;
#define N 11
typedef struct
{
 int x,y,z,steps;
}triPoint;


char map[N][N][N];
int n;
triPoint start, end;
int dir[6][3]={{1,0,0}, {-1,0,0}, {0,1,0}, {0,-1,0}, {0,0,1}, {0,0,-1}};


int bfs(triPoint start)
{
 queue<triPoint>q;
 int i;
 triPoint cur,next;

 //考虑起点和终点相同的情况
 if(start.x==end.x && start.y==end.y && start.z==end.z)
 {
  return 0;
 }

 start.steps=0;
 map[start.x][start.y][start.z]='X';
 q.push(start);
 while(!q.empty())
 {   
  //取队首元素
  cur=q.front();
  q.pop();   

  //广度优先搜索
  for(i=0;i<6;i++)
  {
   next.x=cur.x+dir[i][0];
   next.y=cur.y+dir[i][1];
   next.z=cur.z+dir[i][2];

   if(next.x==end.x && next.y==end.y && next.z==end.z) //下一步就是目的地
   {
    return cur.steps+1;
   }
   if(next.x>=0 && next.x<n && next.y>=0 && next.y<n && next.z>=0 && next.z<n)//下一步不越界
      if(map[next.x][next.y][next.z]!='X') //下一步不是星星
    {
     map[next.x][next.y][next.z]='X';
     next.steps=cur.steps+1;
     q.push(next);
    }//if
  }//for
 }//while
 return -1;
}

int main()
{
 int i,j,steps;
 char str[N];
 while(scanf("START %d",&n)!=EOF)
 { 
  for(i=0;i<n;i++)
   for(j=0;j<n;j++)
    scanf("%s",map[i][j]);
  scanf("%d%d%d",&start.x, &start.y, &start.z);
  scanf("%d%d%d",&end.x, &end.y, &end.z);
  scanf("%s", str);
  gets(str); 
  steps=bfs(start);
  if(steps>=0)
   printf("%d %d/n",n,steps);
  else
   printf("NO ROUTE/n");
 }
 
 return 0;
}
     

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值