用栈和递归求解迷宫问题

一、问题概述

小时候,我们都玩过走迷宫的游戏吧。看一下这个图例:


遇到这种问题时,我们第一反应都会先找到迷宫的入口点,然后对上下左右四个方向进行寻迹,

 检测当前位置是否是通路,是否可以通过,直至找到出口位置,才是迷宫的正确轨迹。如若走到死胡

 同里,则须返回重新选择路径走。

 我们来模拟一下迷宫问题,我们的迷宫是这样的:


哈哈~虽然有点low!但是可以帮助我们解决实际问题,就将就着看吧,这个更能清晰的说明问题哦。

那么这个迷宫从何而来呢?我将它放在文件中,以读取文件的方式,将其坐标保存在二维数组中喽。


二、解决方案

(1)找到入口点(entry),这个由我们自己给定坐标即可。

(2)使用试探法对迷宫寻迹,有上下左右四个方向,将走过的路径标记一下,将值赋值为其他

                 值。(这里我将它赋为2)

(3)如果走进死胡同里,则采用回溯的思想,将其pop即可。

(4)判断何时为迷宫出口,当它的横坐标为(行数-1)时,说明已找到出口。(当然,在这里你

也可以不用规定出口就在最下方,视迷宫的图例而定)

(5)若迷宫没有出口,则栈为空。


三、实现代码


//Maze.h

#include<iostream>
using namespace std;
#include<assert.h>
#include<stack>struct Pos
{int _row;int _col;
};void GetMaze(int *Maze,size_t N)
{FILE* fout = fopen("Maze.txt","r");assert(fout);for(size_t i = 0; i < N; ++i){for(size_t j = 0; j < N; ){int value = fgetc(fout);if(value == '1' || value == '0'){Maze[i*N+j] = value - '0';++j;}else if(value == EOF){cout<<"Maze error!"<<endl;return;}}}
}bool IsCheckPath(int *maze,size_t n,Pos path)
{if((path._row >= 0 && path._row < 10) && (path._col >= 0 && path._col < 10) && (maze[path._row*n+path._col] == 0)){return true;}return false;
}//栈求解迷宫路径
void GetMazePath(int *maze,size_t n,Pos entry,stack<Pos>& s)
{Pos cur = entry;Pos next = cur;maze[cur._row*n+cur._col] = 2;s.push(entry);while(!s.empty()){if(s.top()._row  == n-1){return;}//探测上下左右//上next = s.top();next._row-=1;if(IsCheckPath(maze,n,next)){s.push(next);maze[next._row*n+next._col] = 2;continue;}//右next = s.top();next._col+=1;if(IsCheckPath(maze,n,next)){s.push(next);maze[next._row*n+next._col] = 2;continue;}//下next = s.top();next._row+=1;if(IsCheckPath(maze,n,next)){s.push(next);maze[next._row*n+next._col] = 2;continue;}//左next = s.top();next._col-=1;if(IsCheckPath(maze,n,next)){s.push(next);maze[next._row*n+next._col] = 2;continue;}//没有通路Pos tmp = s.top();maze[tmp._row*n+tmp._col] = 3;s.pop();}
}//递归求解迷宫路径
void GetMazePath(int *maze,size_t n,Pos entry,stack<Pos>& s)
{Pos next = entry;maze[next._row*n+next._col] = 2;s.push(entry);if(next._row == n-1){return;}//探测上下左右//上next = entry;next._row-=1;if(IsCheckPath(maze,n,next)){GetMazePath(maze,n,next,s);}//右next = entry;next._col+=1;if(IsCheckPath(maze,n,next)){GetMazePath(maze,n,next,s);}//下next = entry;next._row+=1;if(IsCheckPath(maze,n,next)){GetMazePath(maze,n,next,s);}//左next = entry;next._col-=1;if(IsCheckPath(maze,n,next)){GetMazePath(maze,n,next,s);}
}void PrintMaze(int *maze,size_t n)
{cout<<"迷宫显示:>"<<endl;for(size_t i = 0; i < n; ++i){for(size_t j = 0; j < n; ++j){cout<<maze[i*n+j]<<" ";}cout<<endl;}
}

//Maze.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include"Maze.h"//用栈和递归实现迷宫问题
const size_t N = 10;void FunTest()
{int Maze[N][N];Pos entry = {2,0};stack<Pos> ss;GetMaze((int*)Maze,N);GetMazePath((int*)Maze,N,entry,ss);cout<<"迷宫是否有出口?"<<!ss.empty()<<endl;PrintMaze((int*)Maze,N);
}int main()
{FunTest();return 0;
}

用栈和递归实现普通的迷宫问题还是可以的,但是还有一种这样的迷宫:


当有多条路径的时候,就会涉及到路径长短的问题,到底走哪条路径会是最优。下篇博客给大家介绍哦。吐舌头吐舌头

希望看过此篇博客的编程爱好者提出见解哈。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

exit(0) return区别

1. return是返回函数调用&#xff0c;如果返回的是main函数&#xff0c;则为退出程序。 exit是在调用处强行退出程序&#xff0c;运行一次程序就结束&#xff0c; 无论写在那里&#xff0c;都是程序推出&#xff0c;括号里的数字0,1,-1会被写入环境变量ERRORLEVEL&#xff0c…

electron 5.0.3版本 改动的地方

BrowserWindow.getFocusedWindow 1. BrowserWindow.getFocusedWindow getFocusedWindow 已经不是一个方法了&#xff0c; 这个简单的问题解决了半天&#xff0c;因为我看文档上 还是当一个方法来调用&#xff0c; 文档没有正确更新&#xff0c;实际上已经变成了一个属性&#…

【c语言】棋盘游戏--三子棋

一、问题概述 大家都玩过棋盘游戏吧&#xff0c;像五子棋一样&#xff0c;玩家或者是电脑一人下一次&#xff0c;当玩家或者是电脑的某一方先将各自的五个棋子下成一条线时&#xff0c;谁就赢&#xff0c;棋盘游戏就会结束。 当然&#xff0c;我今天要介绍的是三子棋&#xff…

【转】浅析task_struct结构体

https://blog.csdn.net/peiyao456/article/details/54407343

electron 主进程与渲染进程 渲染进程与渲染进程 之间的通信

主进程与渲染进程之间的通信 这是渲染进程 // 渲染进程执行主进程里面的方法&#xff0c;主进程给渲染进程反馈处理结果 。 var sendreplayDomdocument.querySelector(#sendreplay); sendreplayDom.onclickfunction(){// alert(1213)//渲染进程给主进程广播数据ipcRenderer.se…

centos升级之gcc 升级 gcc-7.3.0安装

更新于&#xff1a;2018_7_28 安装时间非常非常久&#xff0c;我最快一次40分钟&#xff0c;最长一次两个小时 cd / wget ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz tar -zxvf gcc-7.3.0.tar.gz cd gcc-7.3.0 ./contrib/download_prerequisites mkdir build cd …

[数据结构]用插入排序和选择排序的思想实现优先级队列

一、问题概述 优先级队列的定义&#xff1a; 优先级队列不同于普通的队列&#xff0c;普通的队列具有先进先出的原则&#xff0c;而优先级队列是选择优先级最高的先出队。那么&#xff0c;如何模拟实现优先级队列呢&#xff1f;在这里&#xff0c;我们将较大的值作为优先级较高…

node.js https 模块设置请求头等信息

// https://www.iqiyi.com/v_19rs789v28.html var fs require(fs); var https require(https); var option{rejectUnauthorized: false,hostname:www.iqiyi.com,path:/,headers:{Accept:*/*,Accept-Encoding:utf-8, //这里设置返回的编码方式 设置其他的会是乱码Accept-Lang…

centos升级之vim vim8.0安装

YCM安装攻略&#xff1a;https://blog.csdn.net/csdn_kou/article/details/81213935 卸载旧的vim yum remove vim* -y 一、源码编译安装vim8.0 配置epel源 yum install epel-release 安装python3,以及vim8.0编译环境 yum install -y gcc python34 python34-devel ncurses…

[数据结构]求解迷宫最短路径问题

一、问题概述 之前&#xff0c;我们了解了如何实现迷宫问题&#xff08;对于迷宫只有一个出口可以通的情况&#xff09;&#xff0c;事实上我们的迷宫有多个出口&#xff0c;对于每条路径来说&#xff0c;有长有短&#xff0c;所以在这里&#xff0c;我们讨论一下迷宫的最短路…

centos升级之内核kernel

yum update kernel yum update && yum upgrade # rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm # yum –disablerepo”*” –enablerepo”elrepo-kernel” list ava…

[STL]List的实现

STL&#xff08;Standard template Library&#xff09;:c的标准模板库 STL是算法和数据结构的软件框架&#xff0c;它包含了六大组件&#xff1a;算法、迭代器、容器、仿函数、配接器、空间配置器。 迭代器&#xff1a;我们可以把迭代器相当于智能指针&#xff0c;&#xff0…

python 获取windows上 网络连接信息 ip dhcp dns gateway

import socket import os import re def get_host_ip():"""查询本机ip地址:return:"""try:s socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.connect((8.8.8.8,80))# 能提取出本机ip 通过本机ip提取出其他设置ip s.getsockname()[0]# ip地…

vc++6.0的应用程序打不开肿么办

今天早起&#xff0c;有同学问到我关于vc6.0的安装过程中遇到的问题&#xff0c;我听了之后想想还是写篇博客给大家看一下吧。因为我之前也遇到过类似的问题。当时也是挺着急的。 大家遇到的问题估计就是这样吧~~&#xff08;下载后打不开&#xff09; 请看-->解决步骤&…

【数据结构】广义表

一、问题概述 广义表是非线性的数据结构&#xff0c;是由若干个元素组合而成的&#xff0c;广义表中可以有子表&#xff0c;类似这样的&#xff1a; 我们以C(a,b,(c,d))为例&#xff0c;将它定义为这样的数据结构&#xff1a; 我们会给定字符串的形式&#xff0c;如&#xff…

centos升级之共享文件夹

vmware-hgfsclient vmhgfs-fuse .host:/share /mnt/hgfs 如果不行的话 cd /mnt mkdir hgfs 把上面的在执行一次

批处理创建程序的快捷方式

"D:\AppServ\timer\win_cron_zq\定时.exe" 这是应用程序timer.lnk" 这是快捷方式的名称 echo ThePath "D:\AppServ\timer\win_cron_zq\定时.exe">aaa.vbs echo lnkname "timer.lnk">>aaa.vbs echo WS "Wscript.Shell&quo…

【数据结构】普通二叉树的实现

一、问题概述 树是n个有限个数据的集合&#xff0c;形如&#xff1a; 它像不像倒着的树呢&#xff1f;我们把它看成是一种数据结构----树。它的第一个节点称作树的根&#xff0c;最底下的那些节点称作树的叶子。 我们今天所要研究的是二叉树&#xff0c;即父节点最多只有两个孩…