当前位置: 首页 > news >正文

【算法学习】—n皇后问题(回溯法)

【算法学习】—n皇后问题(回溯法)

1. 什么是回溯法?

相信"迷宫"是许多人儿时的回忆,大家小时候一定都玩过迷宫游戏。我们从不用别人教,都知道走迷宫的策略是:

当遇到一个岔路口,会有以下两种情况:

存在没走过的路。此时可以任意选一条没走过的路深入,只要记住我们所走过的路径即可。

倘若下次再来到这个路口,便不再沿着走过的路径继续深入,而是沿着没走过的路径深入下去;

所有路都已经走过。如果所有岔路口都已经遍历,则回退至上一个最近的岔路口。

当遇到死胡同,便回退到刚才距离最近的岔路口。

不断前进并重复该过程,直到找到终点或回退到起点位置。

其实,这就是回溯法:一个基于深度优先搜索和约束函数的问题求解方法。

(1)、n皇后问题

在这里插入图片描述

在这里插入图片描述

📢 非递归求解n皇后问题

#include <math.h>
#include <stdio.h>
#include <stdlib.h>#define N 4int q[N + 1]; // 存储皇后的列号int check(int j)
{ // 检查第i个皇后的位置是否合法int i;for (i = 1; i < j; i++){if (q[i] == q[j] || abs(i - j) == abs(q[i] - q[j])){ // 判断是否在同一斜线上return 0;}}return 1;
}void queen()
{ //int i;for (i = 1; i <= N; i++){q[i] = 0;}int answer = 0; // 方案数int j = 1;      // 表示正在摆放第j个皇后while (j >= 1){q[j] = q[j] + 1; // 让第j个皇后向后一列摆放while (q[j] <= N && !check(j)){                    // 判断第j个皇后的位置是否合法q[j] = q[j] + 1; // 不合法就往后一个位置摆放}if (q[j] <= N){ // 表示第j个皇后的找到一个合法的位置if (j == N){ // 找到了一组皇后的解answer = answer + 1;printf("放案%d:", answer);for (i = 1; i <= N; i++){printf("%d", q[i]);}printf("\n");}else{ // 继续摆放下一个皇后j = j + 1;}}else{ // 表示第j个皇后找不到一个合法的位置q[j] = 0;  // 还原第j个皇后的位置j = j - 1; // 回溯}}
}
int main()
{queen();return 0;
}

📢 递归求解n皇后问题

#include <math.h>
#include <stdio.h>
#include <stdlib.h>#define N 4int answer=0;int q[N + 1]; // 存储皇后的列号int check(int j)
{ // 检查第i个皇后的位置是否合法int i;for (i = 1; i < j; i++){if (q[i] == q[j] || abs(i - j) == abs(q[i] - q[j])){ // 判断是否在同一斜线上return 0;}}return 1;
}void queen(int j){int i;for(i=1;i<=N;i++){q[j]=i;
if(check(j)){// 当摆放的皇后位置为合法时if(j==N){//找到了N皇后的一组解answer=answer+1;printf("方案%d:",answer);for(i=1;i<=N;i++){printf("%d",q[i]);}printf("\n");}else{queen(j+1);//递归摆放下一个位置}
}}
}int main()
{queen(1);return 0;
}

在这里插入图片描述

相关文章:

【算法学习】—n皇后问题(回溯法)

【算法学习】—n皇后问题(回溯法) 1. 什么是回溯法&#xff1f; 相信"迷宫"是许多人儿时的回忆&#xff0c;大家小时候一定都玩过迷宫游戏。我们从不用别人教&#xff0c;都知道走迷宫的策略是&#xff1a; 当遇到一个岔路口&#xff0c;会有以下两种情况&#xf…...

万亿OTA市场进入新爆发期,2025或迎中国汽车软件付费元年

伴随智能汽车市场规模发展&#xff0c;越来越多的汽车产品具备OTA能力&#xff0c;功能的优化、以及服务的差异化&#xff0c;成为了车企竞争的新战场。 例如&#xff0c;今年初&#xff0c;问界M5 EV迎来了首次OTA升级&#xff0c;升级内容覆盖用户在实际用车中的多个场景&am…...

Android硬件通信之 蓝牙Mesh通信

一&#xff0c;简介 蓝牙4.0以下称为传统蓝牙&#xff0c;4.0以上是低功耗蓝牙&#xff0c;5.0开始主打物联网 5.0协议蓝牙最重要的技术就是Mesh组网&#xff0c;实现1对多&#xff0c;多对多的无线通信。即从点对点传输发展为网络拓扑结构&#xff0c;主要领域如灯光控制等&…...

PG数据库实现bool自动转smallint的方式

删除函数&#xff1a; 语法&#xff1a; DROP FUNCTION IF EXISTS your_schema_name.function_name(arg_type1, arg_type2) CASCADE RESTRICT; 实例&#xff1a; DROP FUNCTION IF EXISTS platformyw.boolean_to_smallint(bool) CASCADE RESTRICT; 查询是否存在函数 语法: SELE…...

易观千帆 | 2023年3月证券APP月活跃用户规模盘点

易观&#xff1a;2023年3月证券服务应用活跃人数14131.58万人&#xff0c;相较上月&#xff0c;环比增长0.61%&#xff0c;同比增长0.60%&#xff1b;2023年3月自营类证券服务应用Top10 活跃人数6221.44万人&#xff0c;环比增长0.08%&#xff1b;2023年3月第三方证券服务应用T…...

2023年江苏专转本成绩查询步骤

2023年江苏专转本成绩查询时间 2023年江苏专转本成绩查询时间预计在5月初&#xff0c;参加考试的考生&#xff0c;可以关注考试院发布的消息。江苏专转本考生可在规定时间内在省教育考试院网&#xff0c;在查询中心页面中输入准考证号和身份证号进行查询&#xff0c;或者拨…...

JavaScript中sort()函数

sort()函数是javascript中自带函数&#xff0c;这个函数的功能是排序。 使用sort()函数时&#xff0c;函数参数如果不设置的话&#xff0c;以默认方式进行排序&#xff0c;就是以字母顺序进行排序&#xff0c;准确的讲就是按照字符编码的顺序进行排序。 var arr [3,2,3,34,1…...

泰克Tektronix DPO5204B混合信号示波器

特征 带宽&#xff1a;2 GHz输入通道&#xff1a;4采样率&#xff1a;1 或 2 个通道上为 5 GS/s、10 GS/s记录长度&#xff1a;所有 4 个通道 25M&#xff0c;50M&#xff1a;1 或 2 个通道上升时间&#xff1a;175 皮秒MultiView zoom™ 记录长度高达 250 兆点>250,000 wf…...

突破传统监测模式:业务状态监控HM的新思路

作者&#xff1a;京东保险 管顺利 一、传统监控系统的盲区&#xff0c;如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性&#xff0c;关于一致性的补偿&#xff0c;已经由算法部的大佬总结过就不在赘述。这里主要讲如何去补偿&#xff…...

0Ω电阻在PCB板中的5大常见作用

在PCB板中&#xff0c;时常见到一些阻值为0Ω的电阻。我们都知道&#xff0c;在电路中&#xff0c;电阻的作用是阻碍电流&#xff0c;而0Ω电阻显然失去了这个作用。那它存在于PCB板中的原因是什么呢&#xff1f;今天我们一探究竟。 1、充当跳线 在电路中&#xff0c;0Ω电阻…...

分布式消息队列Kafka(三)- 服务节点Broker

1.Kafka Broker 工作流程 &#xff08;1&#xff09;zookeeper中存储的kafka信息 ​ 1&#xff09;启动 Zookeeper 客户端。 [zrclasshadoop102 zookeeper-3.5.7]$ bin/zkCli.sh ​ 2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2]…...

蠕动泵说明书_RDB

RDB_2T-S蠕 动 泵 概述 蠕动灌装泵是一种高性能、高质量的泵。采用先进的微处理技术及通讯方式做成的控制器和步进电机驱动器&#xff0c;配以诚合最新研制出的泵头&#xff0c;使产品在稳定性、先进性和性价比上达到一个新的高度。适用饮料、保健品、制药、精细化工等诸流量…...

浅谈react如何自定义hooks

react 自定义 hooks 简介 一句话&#xff1a;使用自定义hooks可以将某些组件逻辑提取到可重用的函数中。 自定义hooks是一个从use开始的调用其他hooks的Javascript函数。 下面以一个案例: 新闻发布操作&#xff0c;来简单说一下react 自定义 hooks。 不使用自定义hooks时 …...

如何优雅的写个try catch的方式!

软件开发过程中&#xff0c;不可避免的是需要处理各种异常&#xff0c;就我自己来说&#xff0c;至少有一半以上的时间都是在处理各种异常情况&#xff0c;所以代码中就会出现大量的try {...} catch {...} finally {...} 代码块&#xff0c;不仅有大量的冗余代码&#xff0c;而…...

海尔智家:智慧场景掌握「主动」权,用户体验才有话语权

2023年1月&#xff0c;《福布斯》AI专栏作家Rob Toews发布了年度AI发展预测&#xff0c;指出人工智能的发展将带来涉及各行业、跨学科领域的深远影响。变革将至&#xff0c;全球已掀起生成式AI热&#xff0c;以自然语言处理为代表的人工智能技术在快速进化&#xff0c;积极拥抱…...

基于铜锁,在前端对登录密码进行加密,实现隐私数据保密性

本文将基于 铜锁&#xff08;tongsuo&#xff09;开源基础密码库实现前端对用户登录密码的加密&#xff0c;从而实现前端隐私数据的保密性。 首先&#xff0c;铜锁密码库是一个提供现代密码学算法和安全通信协议的开源基础密码库&#xff0c;在中国商用密码算法&#xff0c;例…...

LVS的小总结

LVS的工作模式及其工作过程&#xff1a; LVS 有三种负载均衡的模式&#xff0c;分别是VS/NAT&#xff08;nat 模式&#xff09;、VS/DR&#xff08;路由模式&#xff09;、VS/TUN&#xff08;隧道模式&#xff09;。 1、NAT模式&#xff08;NAT模式&#xff09; 原理&#x…...

Spring依赖注入(DI配置)

Spring依赖注入 1. 依赖注入方式【重点】1.1 依赖注入的两种方式1.2 setter方式注入问题导入引用类型简单类型 1.3 构造方式注入问题导入引用类型简单类型参数适配【了解】 1.4 依赖注入方式选择 2. 依赖自动装配【理解】问题导入2.1 自动装配概念2.2 自动装配类型依赖自动装配…...

绘声绘影2023简体中文版新功能介绍

会声会影是一款专业的数字音频工作站软件,它提供强大的音频编辑和制作功能,被广泛应用于音乐创作、录音棚录制以及现场演出等领域。会声会影的最新版本会声会影2023将于2022年底发布,主要功能和新功能详述如下: 会声会影2023主要功能: 1. 直观易用的界面:会声会影采用简洁而不…...

一个好的前端开发人员必须掌握的前端代码整洁与开发技巧

前端代码整洁与开发技巧 ​ 为保证前端人员在团队项目开发过程中的规范化、统一化&#xff0c;特建立《前端代码整洁与开发技巧》文档&#xff0c;通过代码简洁推荐、开发技巧推荐等章节来帮助我们统一代码规范和编码风格&#xff0c;从而提升项目的可读性和可维护性。 目录 …...

【别再困扰于LeetCode接雨水问题了 | 从暴力法=>动态规划=>单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智慧酒厂酒业IP广播设计指南

酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智酒业酒厂IP广播系统设计指南 由北京海特伟业任洪卓发布于2023年4月25日 一、酒厂酒业IP网络广播系统建设需求 随着中国经济的快速稳步发展&#xff0c;中国白酒行业也迎来了黄金时期&#xff0c;产品规模、销售业绩等…...

OpenHarmony JS Demo开发讲解

项目结构 打开entry→src→main→js&#xff0c;工程的开发目录如图所示 其中&#xff0c; i18n文件夹&#xff1a;用于存放配置不同语言场景的资源&#xff0c;比如应用文本词条&#xff0c;图片路径等资源。en-US.json文件定义了在英文模式下页面显示的变量内容&#xff0c…...

CentOS系统安装Intel E810 25G网卡驱动

因特尔网卡驱动给的都是二进制包&#xff0c;需要编译环境。 首先去Intel下载最新的驱动 E810驱动下载&#xff1a;https://www.intel.com/content/www/us/en/download/19630/intel-network-adapter-driver-for-e810-series-devices-under-linux.html?wapkwe810 里面有三个驱…...

Java经典的String面试题

Java经典的Spring面试题 String是基本数据类型吗&#xff1f; String你是基本数据类型String是可变的话&#xff1f; String是final类型的&#xff0c;不可变怎么比较两个字符串的值一样&#xff0c;怎么比较两个字符串是否同一对象&#xff1f; 比较字符串的值是否相同用equa…...

c# 结构体与类区别

在 C# 中&#xff0c;结构体&#xff08;struct&#xff09;和类&#xff08;class&#xff09;都是用户自定义类型&#xff0c;它们具有一些共同的特性&#xff0c;比如可以定义字段、属性、方法等。但它们也有一些区别。 下面是一些结构体和类的区别&#xff1a; 定义方式不…...

使用 patch 命令打补丁

之前的这篇文章 git 导出差异 diff 文件 写了导出 diff 、patch 文件。 拿到 patch 文件&#xff0c;用 patch 命令可以快速的把修改内容合入&#xff0c;合入后在 git 上是已修改的状态&#xff0c;如需提交还要 add 、commit 。 patch 语法 patch --help 可以看到 Usage:…...

C++——类和对象[上]

目录 1.初识面向对象 2.类的引入 3.类的定义 4.成员变量的命名规则 5.类的实例化 6.类对象模型 7.this指针 1.初识面向对象 C语言是一门面向过程的语言&#xff0c;它关注的是完成任务所需要的过程&#xff1b;C是一门面向对象的语言&#xff0c;将一个任务分为多个对…...

MySQL日志

目录 一 关于mysql的设计和运行逻辑 二 MySQL的三类日志 三 对于日志的利用 插入查询 1 备份 2 删除重复数据 一 关于mysql的设计和运行逻辑 mysql在启动的时候非常占空间&#xff0c;需要申请很大的空间&#xff0c;但是有时候内存并没有那么多&#xff0c;所以OS会把my…...

TinyURL 的加密与解密、猜数字游戏、 Fizz Buzz、相对名次----2023/4/28

TinyURL 的加密与解密----2023/4/28 TinyURL 是一种 URL 简化服务&#xff0c; 比如&#xff1a;当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时&#xff0c;它将返回一个简化的URL http://tinyurl.com/4e9iAk 。请你设计一个类来加密与解密 TinyURL 。 加…...