回溯法解决迷宫问题

本文详细介绍了如何用回溯法解决迷宫问题,通过数据结构栈实现。内容包括保存迷宫、打印迷宫、判断通路、寻找出口等步骤,以及在遇到死胡同时的回溯策略。通过实例分析,展示了从迷宫中找到出口的完整过程。
摘要由CSDN通过智能技术生成

迷宫问题,是一个非常经典的问题,我们通过栈这种数据结构来解决这个问题。

1.设计思路


我们这里采用回溯法解决迷宫问题,即从入口出发,顺某一方向试探,若能走通,则继续往前走,否则原路返回,换另一个方向继续试探,直至走出去为止。

2.剖析实例


例如,我们给定下面这样的迷宫:

1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
0 0 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 1 1
1 1 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 1

我们解决的问题就是要简单的从这个迷宫中走出来,所以我们应该首先呢,将所给的这个迷宫保存下来,这里我们采用数组就可以了。然后我们需要对数组当中的这些值进行修改。

2.1保存迷宫

我们首先在一个txt文件当中保存这个迷宫,然后再程序当中,我们所需要做的就是进行读取每一个字符,然后对应的在数组当中保存所对应的数字。

void GetMaze(int *arr)
{
    FILE * mz = fopen("MazeMap.txt", "r");
    assert(mz != NULL);
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N;)
        {
        //对文件中的每个字符进行获取,如果获取到的字符是我们要的,进行处理保存到数组中,如果不是,那么结束这次循环,读取下一个字符。
            char ch = fgetc(mz);
            if (ch == '0' || ch == '1')
            {
            //在这里我们采用一维数组的方式来进行访问,特别要记住,二位数组其实在内存分布上就是一个一维数组,另外,不要忘记我们取出来的是字符,要把它变成数字保存在数组当中。
                arr[i*N + j] = ch-'0';
                j++;
            }
            continue;
        }
    }
    fclose(mz);
}
2.2 打印迷宫

我们将这个迷宫保存到了数组当中,为了我们观察前后走出迷宫的过程,我们要吧这个数组打印出来才可以。

void PrintMaze(int *arr)
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << arr[i*N + j]<<" ";

        }
        cout << endl;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值