求迷宫的的算法

本文介绍了一种基于广度优先搜索(BFS)的迷宫求解算法,通过使用队列来跟踪路径并标记已访问的节点,最终输出从起点到终点的最短路径。代码实现了迷宫构建、路径搜索和路径打印功能。

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

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define MAXN 100

using namespace std;

int q[MAXN*MAXN];
int maze[MAXN][MAXN],fa[MAXN][MAXN],vis[MAXN][MAXN],dist[MAXN][MAXN];  //墙是1空白是0 
int n, m;
int dir[4][2]={{0,-1}, {-1,0}, {0,1}, {1,0}};
int last_dir[MAXN][MAXN];
void bfs(int x, int y)
{
     int front=0, rear=0, d, u;
     u = x*m+y;
     vis[x][y] = 1; fa[x][y] = u; dist[x][y]=0;
     q[rear++] = u;
     while(front<rear)
     {
      u=q[front++];
      x = u/m; y = u%m;
       for(d=0; d<4; d++)
       {
         int nx = x+dir[d][0], ny = y+dir[d][1];
         if(nx>=0&&nx<n && ny>=0&&ny<m &&!maze[nx][ny]&&!vis[nx][ny])
         {
          int v = nx*m+ny;
          q[rear++] = v;
          vis[nx][ny] = 1;
          fa[nx][ny] = u;
          dist[nx][ny] = dist[x][y]+1;
          last_dir[nx][ny]=d;
         }
       }
     }
}
int step[MAXN];
char name[4]={'L','U','R','D'};
void printf_path(int x, int y)
{
     int c = 0;
     for(;;)
     {
      int fx = fa[x][y]/m;
      int fy = fa[x][y]%m;
      if(fx==x&&fy==y)break;
      step[c++]=last_dir[x][y];
      x=fx;
      y=fy;
     }
     while(c--)
     cout<<name[step[c]]<<' ';
}
int main()
{
   int i, j;
    while(cin>>n>>m)
    {
    memset(vis, 0, sizeof(vis));
    memset(dist, -1, sizeof(dist));
    memset(q, 0, sizeof(q));
     for(i=0; i<n; i++)
     for(j=0; j<m; j++)
     cin>>maze[i][j];
     bfs(0,0);
     for(i=0; i<n; i++)
     {
     for(j=0; j<m; j++)
     cout<<dist[i][j]<<' ';
     cout<<endl;
     }
     printf_path(1,4);
    }
   system("pause");
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值