走迷宫算法1(递归 非最短路径)
递归
递归的概念
简单的说,递归就是函数/方法自己调用自己。
每次调用传入不同的变量。
递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。
递归需要遵守的重要原则
1)执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)。
2)函数的局部变量是独立的,不会相互影响。
3)递归必须向退出递归的条件逼近,否则就是无限递归。
4)当一个函数执行完毕,或者遇到 return ,就会返回,遵守谁调用,就将结果返回给谁。
同时当函数执行完毕或者返回时,该函数本身也会被系统销毁。
走迷宫算法
初始化迷宫
我们可以用二维数组来表示迷宫:
先创建一个二维数组,模拟一个迷宫地图。
1 代表墙。
0 代表没有走过的点。
2 元素的值为2,表示可以走通的路。
3 表示曾经走过,但是是一条死路。
==========迷宫地图==========1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
迷宫地图如图所示:
思路分析
使用递归思想来走迷宫。
设置一开始走迷宫的策略为:下、右、上、左。
由起点开始(1,1),递归地分别查看 下、右、上、左 格子的状态。
直到终点(5,6)被标识为 2 ,说明成功走到了终点,这个迷宫从设置的起点出发,可以走到迷宫的终点。
完整代码
/*数据结构递归走迷宫算法
*/
package mainimport "fmt"// 找迷宫的出路的算法
// mazeMap 迷宫的地图
// i,j 出发点的坐标
func GetMazeWay(mazeMap *[8][7]int, i int, j int) bool {if mazeMap[6][5] == 2 {return true} else {// 说明要继续找// 说明可以继续探索,起始点不在墙上if mazeMap[i][j] == 0 {// 假设这个点是通路// 但是能不能通还需要具体探测// 探测的策略 (下、右、上、左)mazeMap[i][j] = 2if GetMazeWay(mazeMap, i+1, j) { // 向下走return true} else if GetMazeWay(mazeMap, i, j+1) { // 向右走return true} else if GetMazeWay(mazeMap, i-1, j) { // 向上走return true} else if GetMazeWay(mazeMap, i, j-1) { // 向左走return true} else { // 死路mazeMap[i][j] = 3return false}} else { // 说明这个点不能探测,是一堵墙return false}}}func main() {// 先创建一个二维数组,模拟一个迷宫地图// 1 代表墙// 0 代表没有走过的点// 2 元素的值为2,表示可以走通的路// 3 表示曾经走过,但是是一条死路var mazeMap [8][7]int// 把最外的一圈设置为墙for i := 0; i < len(mazeMap); i++ {for j := 0; j < len(mazeMap[i]); j++ {if i == 0 || i == (len(mazeMap)-1) {mazeMap[i][j] = 1}if j == 0 || j == (len(mazeMap[i])-1) {mazeMap[i][j] = 1}}}mazeMap[3][1] = 1mazeMap[3][2] = 1// 输出地图fmt.Println("==========迷宫地图==========\n")for i := 0; i < len(mazeMap); i++ {for j := 0; j < len(mazeMap[i]); j++ {fmt.Print(mazeMap[i][j], " ")}fmt.Println()}GetMazeWay(&mazeMap, 1, 1)fmt.Println("\n==========迷宫地图&走迷宫的路径==========\n")for i := 0; i < len(mazeMap); i++ {for j := 0; j < len(mazeMap[i]); j++ {fmt.Print(mazeMap[i][j], " ")}fmt.Println()}}
执行结果
==========迷宫地图==========1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1==========迷宫地图&走迷宫的路径==========1 1 1 1 1 1 1
1 2 0 0 0 0 1
1 2 2 2 0 0 1
1 1 1 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 2 2 1
1 1 1 1 1 1 1
走迷宫算法1(递归 非最短路径)相关推荐
- DFS走迷宫问题(非最短路径)
上面之所以要强调非最短路径,是因为在下一篇我要用BFS来求解最短路径的问题.这里只是讲如何走出迷宫. #include<cstdio> #define M 10 #define N 10 ...
- 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)
前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...
- 图的遍历(递归+非递归)
图遍历一共有四种,邻接矩阵的BFS与DFS,邻接表的BFS与DFS 还有BFS(BFS没有递归!)与DFS递归与非递归: 目录 DFS 手工 邻接矩阵 递归 非递归 邻接表 递归 非递归 BFS 手工 ...
- java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...
- 快排递归非递归python_Python递归神经网络终极指南
快排递归非递归python Recurrent neural networks are deep learning models that are typically used to solve ti ...
- c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析
C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...
- 数据结构(七)图的遍历(递归非递归方法)
图的遍历(递归非递归方法) #include<iostream> #include<stdio.h> #include<stack> #include<que ...
- 数据结构(六)二叉树的遍历(递归非递归方法)
数据结构(六)二叉树的遍历(递归非递归方法) 一.递归方法 1.先序遍历 void PreOrder(BiTree T) {visit(T);PreOrder(T->LChild)PreOrde ...
- 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++
a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...
- 二叉树——中序遍历(递归/非递归)
中序遍历,即遍历顺序为:左节点.根节点.右节点. 二叉树节点: public class Node {public Node left;public Node right;public int val ...
最新文章
- Opencv各版本Release下载
- 大型网站演化发展历程之三
- Python整型数与字符串相互转换
- 直播 | 旷视研究院最新理论成果:批归一化和权重衰减的球面优化机制
- 10个 DIV+CSS 需要注意的问题
- 5G加持!刘作虎确认一加7 Pro:屏幕成本是普通旗舰2倍
- uml类图用什么软件画_为什么需要UML类图建模?
- 常用图表的用法-分布类
- CTP: 找ActionDay 和TradingDay说点事
- 计算机aero背景黑,win7系统如何打开和关闭Aero特效
- 使用NVivo完善定性编码的艺术
- 希腊字母表(含读音)
- win10桌面显示计算机及网上邻居,Win10网上邻居在哪? Win10桌面显示网上邻居网络图方法...
- 支付宝小程序获取手机号和授权信息遇坑锦集
- 毕业三周年,又一个离别季
- Ant Design Vue 动态路由
- 软件开发过程与项目管理(12.软件项目合同计划)
- SAP中状态参数文件最高状态和最低状态的理解
- Dotween简单安装设置
- 零 XML 多表联查