求解迷宫从入口到出口的路径【算法】【栈】【深度优先搜索】

题目:求解迷宫从入口至出口的路径

创建一个迷宫,求从入口通向出口的可行路径。
为简化问题,迷宫用二维数组 int maze[10][10]来存储障碍物的分布。
假设迷宫的横向和纵向尺寸的大小是一样的,并由程序运行读入, 若读入迷宫大小的值是n(3<n<=10),则该迷宫横向或纵向尺寸都是n,规定迷宫最外面的一圈是障碍物,迷宫的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1代表该位置是障碍物,若maze[i][j] = 0代表该位置是可以行走的空位(0<=i<=n-1, 0<=j<=n-1)。求从入口maze[1][1]到出口maze[n-2][n-2]可以走通的路径。要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走,规定必须按向右、向下、向左、向上的顺序向前搜索试探

输入格式:
输入迷宫大小的整数n, 以及n行和n列的二维数组(数组元素1代表障碍物,0代表空位)。
输出格式
依次输出从入口到出口可行路径每个位置的行列下标(i,j),每个位置间用“,”分隔。若没有通路,输出:NO。

输入样例 1

4
1 1 1 1
1 0 1 1
1 0 0 1
1 1 1 1

输出样例 1

(1,1)(2,1)(2,2)

输入样例 2

10
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 1
1 0 0 1 0 0 0 1 0 1
1 0 0 0 0 1 1 0 0 1
1 0 1 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 1 0 0 0 1 0 0 1
1 0 1 1 1 0 1 1 0 1
1 1 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

输出样例 2

(1,1)(1,2)(2,2)(3,2)(3,1)(4,1)(5,1)(5,2)(5,3)(6,3)(6,4)(6,5)(7,5)(8,5)(8,6)(8,7)(8,8)

题目分析
注意题目的步骤,是从(1,1)开始的而不是(0,0),且每次搜索是有一个方向的先后顺序的,而不是求最短路径等等,如果是求最短路径等需要用到广搜等。
另外,该题需要输出的是每一步的坐标,故我们的栈里储存的应该是点的坐标,用pair容器存<int,int>类型数据

#include<iostream>
#include<stack>
using namespace std;

typedef pair<int,int> PII;//构建坐标类型数据容器
const int N = 11;
int maze[N][N],d[N][N];//maze是地图,数组d是用来记录每个点是否已经走过
int n,flag;//n是地图大小,flag用来判断搜索是否结束

stack<PII> s,ans; 
void dfs(int xx,int yy)
{
    s.push({xx,yy});//将传入的坐标入栈
    d[xx][yy] = 1;//该点状态定义为已走
    if((xx == n-2 && yy == n-2))
    {
        //如果已经到达出口
        flag = 1;
        return;
    }
    int dx[] = {0,1,0,-1} , dy[] = {1,0,-1,0};//定义四个方向

        for(int i = 0 ; i < 4 ; i ++)
        {
            int x = xx + dx[i], y = yy + dy[i];
            if(x < n &&x >= 0 && y < n && y >=0 && maze[x][y] == 0 && !d[x][y])
            {
                dfs(x,y);
                if(flag)return;//到达出口后回溯至此时,可以直接结束
            }
        }
    s.pop();//该点不可走时,弹出该点坐标
    
}

int main()
{
    cin >> n;
    for(int i = 0; i < n; i ++)
        for(int j = 0; j < n; j ++)
            cin >> maze[i][j];//创建迷宫
    //if(maze[1][1] == 0)s.push({1,1});
    dfs(1,1);//从出口开始搜索

    //由于最终得到的栈的顺序是从入口至出口的,故需要将栈反转一下

    if(!s.size())cout << "NO";//如果最后栈空,表示路径不通

    while(s.size())
    {
        ans.push({s.top().first,s.top().second});
        s.pop();
    }
    while(ans.size())//反转后依次输出即可
    {
        cout << '(' << ans.top().first << ',' << ans.top().second << ')';
        ans.pop();
    }
    return 0;
}

题目来源:拼题A上老师布置的一道题
欢迎在评论区进行反馈

  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
基于Python实现蚁群算法与广度优先搜索求解迷宫最优路径问题源码+exe可执行程序(直接运行).zip 【项目介绍】 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 蚁群算法&广度优先算法求解迷宫最优路径问题(附带GUI)<br> Install step1.clone该Repository到你的本地路径 step2.解压缩 项目结构: >aco-bfs-for-Maze-GUI `根目录`<br> >>GUI.exe `打包的exe文件`<br> >>readme.md `readme文件`<br> >>src `源代码文件`<br> >>>GUI.py `GUI代码文件`<br> >>>aco.py `蚁群算法代码文件`<br> >>>bfs.py `广度优先算法代码文件`<br> step3.安装项目运行时所需要的外部库 wxpython:GUI图形库<br> [安装教程](https://www.cnblogs.com/icelee1218/p/8127670.html)<br> Usage 使用任意python代码编辑器或IDE打开`src`文件<br> 运行`GUI.py`<br> ![image]( /readme-imgs/blob/master/aco-bfs-for-Maze-GUI/start.png)<br> 选择`迷宫尺寸`<br> 点击`生成迷宫`<br> ![image]( /readme-imgs/blob/master/aco-bfs-for-Maze-GUI/maze.png)<br> 点击`蚁群算法`执行蚁群算法动画,点击`广度优先算法`执行广度优先算法动画<br> Pack 可使用[PyInstaller](http://www.pyinstaller.org/)将该项目打包成exe格式。<br> `PyInstaller`安装: ``` pip install pyinstaller ``` 使用: ``` pyinstaller -F -w GUI.py ``` 在`GUI.py`相同目录下会新增`dist`文件夹,内部放有`GUI.exe`文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AC Maker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值