023.【回溯算法】

news2024/9/22 21:18:58

1. 回溯算法

回溯算法也叫试探法,它是一种系统地搜索问题而求解的方法。回溯算法可以找出所有解的一般性,同时可以避免不正确的数值。一旦发现不正确的数值,就不再继续下一层而是返回到上一层,以节省时间。简单来说,回溯算法就是遇到错误就退缩的一种算法。

用通俗易懂的话描述就是:通过选择不同的岔路口寻找目的地,一个岔路口、一个岔路口地去尝试找到目的地。如果走错了路,继续返回来找到岔路口的另一条路,直到找到目的地。

2. 四皇后问题

皇后是国际象棋中实力最强的棋子,可横、直、斜走,且格数不限。四皇后问题就是由此演变出来的,在4×4格的国际象棋棋盘上摆放4个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

步骤1:安排皇后1的位置,皇后1是随机放的,我们这里先尝试在网格的第1个单元格放置皇后1,如图4所示。

说明:白色的单元格表示在皇后1的攻击范围内,不可以安排另一位皇后的位置,蓝色的单元格表示非皇后1的攻击范围,可以安排其他皇后的位置。

在这里插入图片描述

步骤2:安排皇后2的位置,皇后2可以被安排的位置有:在第2行、第3列的单元格和第2行、第4列的单元格中。下面先把皇后安排在第2行、第3列的单元格中。

图5  将皇后2安排在第2行、第3列的单元格中

步骤3:安排皇后3的位置,此时,皇后3只能安排在第4行、第2列的单元格中。

图6  将皇后3安排在第4行、第2列的单元格中

步骤4:如果将皇后3放置在第4行第2列单元格中,此时4×4的网格全部变白(全部网格都处于已安置的皇后的攻击范围内),皇后4就没有位置安放了。此时使用回溯算法,退回到上一步,重新安排皇后3的位置。而皇后3只可以放在第4行第2列单元格中,无法更改位置,那就再退回到上一步,重新安排皇后2的位置。皇后2还可以被安排在第2行、第4列的单元格中。

图7  将皇后2安排在第2行、第4列的单元格中

步骤5:再次安排皇后3的位置,此时皇后3只能安排在第3行、第2列的单元格中。

图8  将皇后3安排在第3行、第2列的单元格中

步骤6:此时4×4的网格全部变白(全部网格都处于已安置的皇后的攻击范围内),没有位置安放皇后4。使用回溯算法,退回到上一步,重新安排皇后3的位置。皇后3也无格可换,再退回到上一步重新安排皇后2的位置,而皇后2可以安排的两种可能都不可行。换句话说,皇后2也无格可换,就需要再退回到上一步,重新安排皇后1的位置,这次将皇后1的位置安排在第1行、第2列的单元格中。
图9  将皇后1的位置安排在第1行、第2列的单元格中
步骤7:然后安排皇后2的位置,将皇后2安排在第2行、第4列的单元格中。

图10  将皇后2安排在第2行、第4列的单元格中

步骤8:接着安排皇后3的位置,将皇后3安排在第3行、第1列的单元格中。

在这里插入图片描述
步骤9:最后安排皇后4,将皇后4安排在第4行、第3列单元格中。
图12  将皇后4安排在第4行、第3列单元格中

至此,已经用4×4网格将4个皇后的位置安排妥当了。

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

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

相关文章

OpenVino 2023.0学习使用(1)-简介

模型制备 每一个深度学习工作流程都是从获取模型开始的。您可以选择准备一个自定义的网络,使用现成的解决方案并根据您的需求进行调整,甚至可以从在线数据库下载并运行预先训练的网络,例如TensorFlow Hub,Hugging Face&#xff0…

C++入门:类和对象(中)

目录 前言: 一:类的6个默认成员函数 二:构造函数(第一个成员) (1)概念 (2)特性 (3)特性的解析 ⭐特性4 ⭐特性5 ⭐特性6 ⭐特性7 三:初始化列表 (1)引入 (2)概念 (3)注意 四:析构函数(第二个成员) …

2023年软件测试的高薪机会在哪?

没入行或已经入行测试的小伙伴们,快看过来。来看看你们的高薪机会在哪里! 我们先来看几个高薪招聘需求! 高薪招聘需求1 要求看起来不是很高,应届生和在校生都可以,而且薪资达到了12K,14薪。 但是&#xff0…

roop 一张图片就能生成换脸视频的开源项目

roop的github地址:https://github.com/s0md3v/roop 安装python(pip如果需要也安装) 记住到 2023-6-18 这天 一定要是python3的10版本,11版本会有包不兼容,我就这个问题耗费了一天。 我使用的是:python3.1…

图的单源最短路算法:Bellman-Ford

Bell-Ford算法思想 对一个点的松弛操作,就是找到经过这个点的另外一条路径(多走一条边),使得花费的代价更小。 如果一个图没有负权环,从一点到另外一点的最短路径,最多经过所有的V个顶点,有V-1…

微信代加什么意思

微信代加什么意思,信息流加粉推广怎么做,信息流怎么做加粉推广?信息流微信加粉#信息流代运营#信息流推广#加粉引流推广#抖音引流推广#信息流加粉链路#抖音#百收助推 近期有客户问信息流微信加粉怎么做? 嗯,首先说一下…

开箱即用的shell脚本(一)

目录 一、通过位置变量创建 Linux 系统账户及密码 二、初始化脚本 三、nginx启动脚本 四、每周 5 使用 tar 命令备份/var/log 下的所有日志文件 五、实时监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小于 1000M时,发送报警邮件给 …

C语言之动态内存分配(1)

目录 本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 动态内存管理—自己维护自己的内存空间的大小 首先我们申请一个变量,再申请一个数组 这是我们目前知道的向内存申请…

【小沐学Python】Python实现Web服务器(Flask,gevent )

文章目录 1、简介1.1 功能列表1.2 支持平台1.3 安装 2、gevent入门示例2.1 文件IO2.2 MySQL2.3 redis2.4 time2.5 requests2.6 socket2.7 并发抓取文字2.8 并发抓取图片2.9 生产者 - 消费者 3、gevent其他示例3.1 StreamServer3.2 WSGI server3.3 flask3.4 websocket3.5 udp 结…

LeetCode 1254. 统计封闭岛屿的数目

【LetMeFly】1254.统计封闭岛屿的数目 力扣题目链接:https://leetcode.cn/problems/number-of-closed-islands/ 二维矩阵 grid 由 0 (土地)和 1 (水)组成。岛是由最大的4个方向连通的 0 组成的群,封闭岛是…

Spark-核心常见面试题集锦(RDD、shuffle类型、数据倾斜优化、小文件问题、性能调优、streaming流程、checkpoint机制)

1 Spark的任务执行流程 第一种standalone模式 整体:driver中有sparkcontext,RDD DAG和DAGScheduler和taskscheduler,master是资源管理,worker中executor,executor中有多个task 构建一个application环境,d…

在线查看EventBus源代码

github:/src/org/greenrobot/eventbus/ 例如:EventBus.java

【LeetCode】HOT 100(15)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

024.【链表算法】

1. 创建单向链表 例如,有“学生”这样一个链表,链表中需要包括学生的姓名、性别、学号等一些基本信息。创建这样的一个链表,链表里面包括多个学生的信息。 可以看出,“学生一”的尾结点“next”指向了下一个“学生二”的头结点学…

【并发编程】创建线程的三种方法

源码 Runnable 函数式接口 package java.lang; FunctionalInterface public interface Runnable { public abstract void run(); }Thread 就是一个典型的静态代理模式 public class Thread implements Runnable {private Runnable target;public Thread() { in…

接口测试用例如何编写?

目录 前言: 在开始编写接口测试用例之前,需要注意几件事: 编写接口测试用例的步骤包括: 常遇到的问题包括: 前言: 编写接口测试用例是接口测试的重要一环。好的接口测试用例能够充分覆盖接口各种情况&…

jmeter负载测试中如何找到最大并发用户数(实战)

目录 前言 负载测试概念 脚本总体设计: 场景介绍: 前言 在进行负载测试时,找到最大并发用户数是非常重要的,这个值将会告诉您系统可以承受多大的并发请求。 在性能测试中,当我们接到项目任务时,很多时…

热烈Matplotlib子图不不会画来看看-分图绘制(怒肝万字)

👨🏻‍🎓博主介绍:大家好,我是大锤爱编程的博客_CSDN博客-大数据,Go,数据分析领域博主,有五年的数据开开发,有着丰富的数仓搭建、数据分析经验。我会在我的系列文章里面分享我学到的知识&#x…

计算机服务器中了encrypted勒索病毒怎么办,什么是encrypted勒索病毒

Encrypted勒索病毒是一种非常危险的电脑病毒,该病毒通过加密计算机中的文件和数据,使其无法访问和使用计算机,并要求受害者支付一定的赎金以获得解密密钥。 Encrypted勒索病毒是一种常见的勒索软件,由于它使用先进的加密技术&…

ansible的部署和模块

一、 ansible 的概述 1、ansible简介 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。 它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。 它使用SSH来和节点进行通信。Ansible基于 …