数据结构和算法(递归概念、迷宫回溯问题和八皇后问题代码实现)

2023-11-17

递归的概念:

在这里插入图片描述
在这里插入图片描述

递归能够做解决什么问题?

在这里插入图片描述

使用递归时需要注意的问题:

在这里插入图片描述

递归的第一个应用:迷宫回溯问题
迷宫模拟:

定义一个8×7的数组模拟迷宫:
1表示围墙,0表示可以走的路
图中左上红圈为起点,右下红圈为终点
利用代码找到从起点到终点的路径
在这里插入图片描述

使用递归回溯找寻路

说明
1.定义map 表示地图
2.定义i,j,表示从地图的哪个位置开始出发
3.如果能到map[6][5]位置,则说明通路找到
4.约定:当map[i][j] 为 0 表示该点没有走过,当为1表示墙,2表示通路可以走,3表示该点已经走过,但是走不通
5.在走迷宫时,需要确定一个策略(方法)下 -> 右 -> 上 -> 左,如果该点走不通,则开始回溯

	/**
	 * 
	 * @param map 表示地图
	 * @param i 从哪个位置开始找
	 * @param j
	 * @return 如果找到位置,就返回true,否则返回false
	 */
	public static boolean setWay(int[][] map, int i, int j) {
		if (map[6][5] == 2) {// 终点,通道已找到,不再自我调用,开始回溯
			return true;
		} else {
			if (map[i][j] == 0) {// 如果当前这个点没有走过
				// 按照策略 下、右、上、左
				map[i][j] = 2;// 假定该点是可以走通的
				if (setWay(map, i + 1, j)) {//向下走
					return true;
				} else if (setWay(map, i, j + 1)) {//向右走
					return true;
				} else if (setWay(map, i - 1, j)) {//向上
					return true;
				} else if (setWay(map, i, j-1)) {//向左走
					return true;
				}else {
					//如果上述通路都不能走通,则表示是死路,不再自我调用,开始回溯
					map[i][j] = 3;
					return false;
				}

			}else {
				//如果该点不为0,为1、2、3,就返回false,(为什么有2:如果从2继续找路,可能会进入死循环)
				//不再自我调用,开始回溯
				return false;
			}
		}
	}
递归的第二个应用:八皇后问题

八皇后问题介绍
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。(92种)

思路分析:

在这里插入图片描述
在这里插入图片描述

使用递归解决八皇后问题的完整代码(可直接复制运行):
public class Queen8 {
	// 定义一个max表示共有多少个皇后
	int max = 8;
	// 定义数组array,保存皇后放置位置的结果,比如arr = {0,4,7,5,2,6,1,3}
	int[] array = new int[max];
	static int count = 0;//用来计数

	public static void main(String[] args) {
		Queen8 queen8 = new Queen8();
		queen8.check(0);
		System.out.printf("一共有%d种解法",count);
		
	}

	// 核心方法
	// 查看当我们放置 第 n 个皇后、就去检测该皇后是否和前面已经摆放的皇后冲突
	// 使用递归,每一次递归都有一个for循环,因此会有回溯
	private void check(int n) {
		if (n == max) {// n = 8,其实已经放好皇后了,因为从0开始
			print();// 开始回溯的起点,直接打印
			return;
		}
		for (int i = 0; i < max; i++) {
			//先把当前这个皇后 n ,放到该行的第 1 列
			array[n] = i;
			//判断当放置第 n 个皇后到 i 列,是否冲突
			if(judg(n)) {//不冲突
				//接着开始放n+1个皇后,即开始递归
				check(n+1);
			}
			//如果有冲突,不要紧,进入循环
		}
	}

	/**
	 * 
	 * @param n 表示第 n 个皇后
	 * @return
	 */
	private boolean judg(int n) {
		for (int i = 0; i < n; i++) {
			// 下标表示行,值表示列
			// array[i] == array[n] -> 值相等 -> 列相等
			// Math.abs(i-n)->下标之差-> 行之间的差距
			// Math.abs(array[i]-array[n])->值之间的差->列之间的差距
			// Math.abs(i-n) == Math.abs(array[i]-array[n]) ->
			// 行之间的差距和列之间的差距相等,构成等腰直角三角形,即在斜线上

			if (array[i] == array[n] || Math.abs(i - n) == Math.abs(array[i] - array[n]))
				return false;
		}
		return true;
	}

	// 将结果输出
	private void print() {
		count++;
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
		System.out.println();
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构和算法(递归概念、迷宫回溯问题和八皇后问题代码实现) 的相关文章

随机推荐

  • C#readonly关键字

    readonly是一种常量修饰符 区别于const 分别进行记录 先说const const是静态常量或者叫编译时常量 是指编译器在编译时候会对常量进行解析 并将常量的值替换成初始化的那个值 必须在声明的时候初使化 const 关键字声明的
  • Java工程师学快速Python(3)----- 模块、包、库 输入 输出

    简单的说一个 py文件就是一个模块 多个 py文件整合成一个包 各种包的集合就是库 import 语句 想使用 Python 源文件 只需在另一个源文件里执行 import 语句 语法如下 import module1 module2 mo
  • Endnote显示cannot edit range(无法编辑range)

    1 方法1 这种问题的原因可能是选择了 Convert to Unformatted Citations 正确的方法应该是在Word中选择endnote页面 Convert Word Citations to EndNote 然后再 Upd
  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 公众号 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 专注 企业运维实践 网络安全 系统运维 应用开发 物联网实战 全栈文章 等知识分享 花开堪折直须折 莫待无花空折枝 作者主页 https w
  • 如何在word文档中添加两个目录

    由于需要在一个word文档中添加两个目录 第一个目录表示文章前半部分的内容 第二个目录表示后半部分的内容 对于word不太熟悉的我经过一番折腾之后终于搞定了 在此记录一下 原理 将word文本划分成两个域 而每个域里的标题可以看做是不同的书
  • echarts 关系图 参数_Echarts关系图(使用重力图)

    首先展示一下该关系图效果 很简单的关系图 不过其中经历不少波折 使用的是echarts2 现在贴出代码 1 functiondos 2 var name document getElementById name value 3 post G
  • Pandas玩转数据透视表,用它就够了~

    大家好 我是丁小杰 对于数据透视表 相信对于 Excel 比较熟悉的小伙伴都知道如何使用它 并了解它的强大之处 而在pandas中要实现数据透视就要用到pivot table了 导入示例数据 首先导入演示的数据集 import pandas
  • 【C++】STL之栈(stack)介绍

    栈 stack 栈是一种运算受限的线性表 限定仅在表尾进行插入和删除的操作 插入 push 弹出 pop 其特性就是先进后出 即先插入的元素最后才能弹出 大家可以把栈想象成一个弹夹 你只能在顶层一颗一颗装入子弹 先装的子弹在最底层 打出时也
  • 学什么副业前景好?学一个什么副业比较好?自学副业有哪些?

    很多公司不希望自己的员工做副业 主要还是担心员工做副业会影响到工作 如果员工在下班后的空闲时间搞搞副业 那公司就没法管了呀 你平时下班后的空闲时间都做些什么 学什么副业前景好 1 自学ps 现在很多影楼 摄影工作室 电商商家会把自己拍摄的照
  • JVM调优参数归纳汇总

    GC通常参数 Xss 每个线程的栈大小 Xms 初始堆大小 默认物理内存的1 64 Xmx 最大堆大小 默认物理内存的1 4 Xmn 新生代大小 XX ParallelGCThreads 指定GC工作的线程数量 XX MinHeapSize
  • 查询局域网电脑的IP,端口号,MAC地址

    网上看到很多都是使用nmap工具 这个工具我没有使用过 我自己实现nmap工具的功能 首先我们查询局域网内有哪些电脑是alive的 下面我写了一个脚本 ping sh 这样局域网内哪些电脑的ip是alive的就可以知道 下面来查看对于IP的
  • leetcode--55--跳跃游戏

    题目描述 给定一个非负整数数组 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的 最大长度 判断你是否能够到达最后一个位置 示例 1 输入 2 3 1 1 4 输出 true 解释 我们可以先跳 1 步 从位置 0 到达
  • 【ChatGPT】基于WSL+Docker的ChatGPT PLUS共享服务部署

    最近买了ChatGPT PLUS服务 想通过web服务将它共享给其他人使用 搜了一下目前GitHub上比较热门的服务有 ChatGPT Next Web chatgpt web share 其中chatgpt web share支持API和
  • 【uni-app】css 关于 calc()函数计算无效

    计算符 注 计算 符前后都需要空格 否则计算无效
  • 华为OD机试真题 Java 实现【最多提取子串数目】【2023Q1 100分】

    一 题目描述 给定由 a z 26 个英文小写字母组成的字符串 A和 B 其中A中可能存在重复字母 B 中不会存在重复字母 现从字符串 A 中按规则挑选一些字母 可以组成字符串 B 挑选规则如下 同一个位置的字母只能被挑选一次 被挑选字母的
  • ue4加载本地版本_【虚幻4】创建本地数据库

    简介 这里我们主要通过使用Data table实现本地数据库 Data table可以用来保存一些用户配置 或者常用变量 或者用来实时更新外部表格数据到虚幻4中 一 创建Data table 1 首先创建Structure结构 这里我已经创
  • 我用什么写Python?

    通常来说 每个程序员都有自己趁手的兵器 代码编辑器 你要是让他换个开发环境 恐怕开发效率至少下降三成 然而 每个人对编辑器的喜好各不相同 甚至引发出诸如 神的编辑器 与 编辑器之神 这种信仰之争 但也正由此可见 个性化的编辑器对于一个程序员
  • 【FICO系列】SAP FICO 凭证错误:BKPFF$PRDCLN800在FI中达到的项目最大编号

    公众号 SAP Technical 本文作者 matinal 原文出处 http www cnblogs com SAPmatinal 原文链接 FICO系列 SAP FICO 凭证错误 BKPFF PRDCLN800在FI中达到的项目最大
  • 无法访问目标主机的原因及其和请求超时的区别

    使用ping命令时经常会遇到这两种情况 就表示网络出了问题 无法访问目标主机的原因 可以看到 无法访问目标主机 是来自一个IP的回复 实际上那个IP是一个路由器 因此 无法访问目标主机 实际上数据是发出去并且收到回复的 只不过收到的回复是别
  • 数据结构和算法(递归概念、迷宫回溯问题和八皇后问题代码实现)

    递归的概念 递归能够做解决什么问题 使用递归时需要注意的问题 递归的第一个应用 迷宫回溯问题 迷宫模拟 定义一个8 7的数组模拟迷宫 1表示围墙 0表示可以走的路 图中左上红圈为起点 右下红圈为终点 利用代码找到从起点到终点的路径 使用递归