迷宫问题的解法

迷宫问题的解

#include<iostream>
using namespace std;
#include<string.h>
#define max1 100
typedef int datatype;
datatype node[max1][max1];//记录坐标是否走过
// 规定东南西北为右下左上
typedef struct
{
    datatype map1[max1][max1];
    int m,n;
}MAP;//迷宫的结构体
typedef struct
{
    int x[max1];
    int y[max1];
}NODE;//储存每一步经过的点的结构体
void createmap(MAP &p)
{
    cout << "请输入迷宫的大小(n*m):" << endl;
    cout << "n:";
    cin >> p.n ; // 迷宫的宽
    cout << "m:";
    cin >> p.m; // 迷宫的长
    cout << "请输入一个" << p.n << "*" << p.m << "的迷宫(1为障碍,0为通路,迷宫入口为(1,1),出口为(" << p.n << "," << p.m << ")):" << endl;
    for(int i=1;i<=p.n;i++)
        for(int j=1;j<=p.m;j++)
        {
            cin >> p.map1[i][j];// 设置通路和障碍
            if(p.map1[i][j]>1)
                p.map1[i][j]=1;// 如果障碍值大于1则重新赋值为1
        }
}
int flag=0;// 记录解的个数
void disp(NODE &p,int n)
{
    if(flag==1)
        cout << "迷宫有解,解如下:" <<endl;
    cout << flag << ":"; // 输出该解是第几个解
    for(int i=0;i<=n;i++) // 打印路径
        if(n!=i)
            cout << "(" << p.x[i] << "," << p.y[i] << ")" << "->";
        else
            cout << "(" << p.x[i] << "," << p.y[i] << ")" << endl;
}
void dfs(MAP &p,int x,int y,NODE &q,int ans)
{
    q.x[ans]=x;//记录当前步数的x坐标
    q.y[ans]=y;//记录当前步数的y坐标
    if(x==p.n&&y==p.m&&p.map1[x][y]==0)//判断是否到达出口
    {
        flag++;// 解的数目加一
        disp(q,ans); // 调用函数打印路径
        return;
    }
    if(y+1<=p.m&&node[x][y+1]==0&&p.map1[x][y+1]==0)//判断能不能向东走
    {
        node[x][y+1]=1;//标记走过的点的坐标
        dfs(p,x,y+1,q,ans+1);// 递归将向东的下一个坐标作为一个新的向东的发散点
        node[x][y+1]=0;// 当回溯时将走过的点的标记归零
    }
    if(x-1>=1&&node[x-1][y]==0&&p.map1[x-1][y]==0)//判断能不能向北走
    {
        node[x-1][y]=1;//标记走过的点的坐标
        dfs(p,x-1,y,q,ans+1);// 递归将向北的下一个坐标作为一个新的向北的发散的点
        node[x-1][y]=0;// 当回溯时将走过的点的标记归零
    }
    if(y-1>=1&&node[x][y-1]==0&&p.map1[x][y-1]==0)//判断能不能向西走
    {
        node[x][y-1]=1;//标记走过的点的坐标
        dfs(p,x,y-1,q,ans+1);// 递归将向西的下一个坐标作为一个新的向西的发散的点
        node[x][y-1]=0;// 当回溯时将走过的点的标记归零
    }
    if(x+1<=p.n&&node[x+1][y]==0&&p.map1[x+1][y]==0)//判断能不能向南走
    {
        node[x+1][y]=1;//标记走过的点的坐标
        dfs(p,x+1,y,q,ans+1);// 递归将向南的下一个坐标作为一个新的向南的发散的点
        node[x+1][y]=0;// 当回溯时将走过的点的标记归零
    }
}
int main()
{
    MAP p;
    NODE q;
    memset(node,0,sizeof(node));// 将标记数组初始化
    createmap(p);// 调用创建迷宫的函数
    node[1][1]=1;// 标记入口
    dfs(p,1,1,q,0);// 以入口为发散的点开始遍历
    if(flag==0)
        cout << "该迷宫没有通路!" << endl;
    return 0;
}


简单迷宫问题解法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值