回溯法经典例题--n皇后问题--C语言

【回溯法】n皇后问题并输出每种解的情况 C语言版 问题描述: 在n×n的方格棋盘上,放置n个皇后,要求n个皇后两两不在一行,不在一列,不在同一对角线上 PS: 行不用检测,因为皇后本身就是一行一行往下放的,并且一行只能放一个,所以当放好一个皇后后,只需检测列及对角线的位置有无皇后,如下图这些位置 思路 【回溯法】 1. 从棋盘的第一行开始,依次遍历所有位置,依次判断当前位置是否能够放置皇后,判断的依据为:同该行之前的所有行中皇后的所在位置进行比较,是否在同一列,或者在同一条斜线上(斜线有两条,为正方形的两个对角线)。 ... 阅读详情

问题描述:

        在n*n的棋盘上尽可能多的放置皇后棋子,但棋子之间不能同行、不能同列、也不能同对角线,请给出可能的放法。

求解:

        根据要求每行一个,那么就让行数i成为递归的自增参数。

        不能同行并且不能同对角线作为剪枝条件。

        首先设计递归函数。

        chess【】【】为棋盘,起始为0,放入棋子后为1,n为棋盘大小,i为当前递归的行数。出口为i==n,即所有行均遍历完毕。否则就遍历当前行的所有列,挨个放皇后,并且每次放之前都要判断当前位置符合要求。

        如果当前的放置方法会让后面几行无法放置皇后,那么就回溯,让chess【i】【j】=0;

void queen(int chess[max][max],int n,int i) {
	if (i == n)
		dis(n, chess);
	for (int j = 0; j < n; j++) {
		if (place(chess, n, i, j)) {
			chess[i][j] = 1;
			queen(chess, n, i + 1);
			chess[i][j] = 0;
			continue;
		}
	}
}

        其次是判断可放置函数place()。

        主要判断两点,一是不同列,二是不同行。

        不同列:遍历当前递归行之前的所有行,找到所有皇后位置判断y!=j。

        不同对角线:即(x,y)与之前放置的皇后(i,j)构成等腰直角三角形,|x-i|==|y-j|,边长相等。

 

bool place(int chess[max][max], int n, int x, int y) {
	for (int i = 0; i < x; i++) {
		int j = 0;
		while (chess[i][j] != 1)
			j++;
		if (j == y||abs(i-x)==abs(j-y))
			return false;
	}
	return true;
}

代码:

        

#include<stdio.h>
#include<iostream>
using namespace std;
#define max 10
void dis(int n, int chess[max][max]) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
			cout << chess[i][j] << " ";
		cout << endl;
	}
	cout << endl;
}
bool place(int chess[max][max], int n, int x, int y) {
	for (int i = 0; i < x; i++) {
		int j = 0;
		while (chess[i][j] != 1)
			j++;
		if (j == y||abs(i-x)==abs(j-y))
			return false;
	}
	return true;
}
void queen(int chess[max][max],int n,int i) {
	if (i == n)
		dis(n, chess);
	for (int j = 0; j < n; j++) {
		if (place(chess, n, i, j)) {
			chess[i][j] = 1;
			queen(chess, n, i + 1);
			chess[i][j] = 0;
			continue;
		}
	}
}

int main() {
	int chess[max][max];
	memset(chess, 0, sizeof(chess));
	int n = 5;
	queen(chess, n, 0);
	return 0;
}

N皇后问题(C语言)—回溯法 一、问题描述 问题描述:在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即不能处于同一列或同一行,也不能处在同一斜线上,请问有多少种摆法? 不能放皇后的位置及位置之间的关系: 二、代码实现 #include <stdio.h> int array[20];//数组大小,a[i] = j表示第i个皇后放在第i行的第j个位置 int n,cnt;//n为皇后的个数 int check(int x,int y)//x为行,y为放置的位置 { int i... 阅读详情

相关推荐

N皇后问题-回溯法-C语言

关于对N皇后问题和回溯法的理解 个人非常推荐下面这个视频算法与数据结构,回溯法求解八皇后,最经典的递归问题_哔哩哔哩_bilibili 视频中的代码使用C++写的,个人接触嵌入式较多所以比较习惯用C C语言代码如下: /* N皇后问题 */ #include <stdio.h> #include <stdlib.h> #define N 100 //宏定义最大的N int attack[N][N]; char queen[N][N]; int cnt; v

weixin_44322104的博客 3687

N皇后问题

N皇后问题,是指在一个N*N的国际象棋棋盘上放置n个皇后,使得这n个皇后两两均不在同一行、同一列、同一条对角线上,求合法的方案数。如下图:n=5的情况 对于这个问题,如果采用组合数的方式来枚举每一种情况(即从n²个位置中选择n个位置),那么将需要的枚举量,当n=8是就是54 502 232次枚举,如果n更大,那么就会无法承受。 但是换个思路,考虑到每行每列只能放置一个皇后,那么如果吧n...

最不正经的计算机专业学生 1689

C语言回溯法之n皇后问题清晰注释

回溯法之N皇后问题回溯法通俗诠释回溯法框架描述(无递归)n皇后的C语言代码 回溯法通俗诠释 手撕算法之回溯法: 回溯法,记得大二学这个算法的时候,哎,原来这么简单!然后去做题的时候真的是一脸懵B,这个回溯法劝君一定要找几十道题好好练一练,这样才能手撕算法,不然,你就等着被撕吧!好了,扯远了,回溯,就是往回查找,大家都懂,这类问题和树的遍历是很像的,解决的问题几乎全是一个样的:我有n中选择,每种选择...

字符串距离问题动态规划 1568

c语言实现n皇后问题,递归回溯法的魅力

让第1个皇后,摆放在第2行,结果经过后面的寻找,剩余3个皇后都找到了合适的位置就完事了。最终找到(2413)满足条件的位置,所谓(2413)意思就是第一个皇后摆放在第2列,第2个皇后摆放在第4列,第3个皇后摆放在第1列,第4个皇后摆放在第3列。)时,即第1个皇后摆放在第1列,第2个皇后摆放在第3列,觉得没问题,但发现当摆放第3个皇后时,发现从第3行中找不到能摆放的位置都有冲突,所谓回溯法,本来摆放第i个皇后的位置没问题的,因为再摆放后面的皇后找不到满足条件的位置,就把前面摆放的第i个皇后的位置换成下一个。

AnalogElectronic的博客 1492

【n皇后问题】c++\c语言解n皇后问题(回溯法)

代码不懂可以看注释,还是较容易理解的,利用flag可以防止不必要的递归。 #include<stdio.h> #include<math.h> int P[10]={0}; //此列的皇后为第几行 int n = 4; //几皇后 bool hashTable[10]={false}; //此行没皇后 void generateP(int index){ if(index == n+1){ for(int i=1;i<=

ChenXiaoshui_的博客 2884

整数变换问题和N皇后问题解析(C语言)

说明:以前的算法现在公布一下。 问题一:整数变换问题:2个整数M,N,求M经过F(i)=3i,g=(int)g/2,变换后变为N的最小次数和变换序列。 问题二:N皇后问题,如何排列N个皇后使在同一行或列或对角线不存在2个皇后。以使其不相互攻击。 解答:采用回溯法,第一步,列出二个问题的排列和分支树。 皇后问题的排列树: 开始   0 第一行 |                     

Beep__Beep__Beep 3841

递归实现回溯法求n皇后问题

hking_ustc的专栏 1016

基于回溯法的n皇后问题求解实战

最直观的方式是使用二维整型数组来模拟棋盘,其中每个元素代表一个格子的状态:// 静态二维数组该数组在内存中按行优先顺序连续存储。例如的地址为:这种布局有利于缓存局部性访问,适合频繁遍历某一行或列的场景。优点:- 直观易懂,便于可视化输出;- 支持任意位置的随机访问;- 易于扩展为图形界面交互。缺点:- 空间复杂度为O(n²),当n较大时占用较多内存;- 冲突检测需遍历整列或对角线,时间复杂度高。

weixin_42608299的博客 1012

【算法-回溯法】N皇后问题

回溯法 N皇后问题

@point 1万+

基于虚拟阻抗重塑的构网型VSG变流器SISO序阻抗建模与宽频振荡抑制策略分析(面向高比例新能源并网场景)

本文深入探讨了基于虚拟阻抗控制的构网型VSG变流器SISO序阻抗建模技术及其在高比例新能源并网场景中的宽频振荡抑制策略。通过虚拟阻抗重塑,有效改善了变流器的阻抗特性,解决了次/超同步频段的振荡问题,并提供了参数设计、阻抗扫频验证等实用技巧,为新能源并网系统的稳定性提供了可靠解决方案。

weixin_29268385的博客 251

从零到一:如何用GraphRAG Visualizer打造你的第一个3D知识图谱

本文详细介绍了如何使用GraphRAG Visualizer从零开始构建3D知识图谱,涵盖环境准备、Parquet数据处理、可视化操作及高级分析功能。通过简洁的步骤和实用技巧,帮助用户快速掌握这一强大的知识图谱可视化工具,提升数据分析和关系挖掘效率。

rock5的博客 220

n皇后问题(C++/C语言实现)回溯法

问题描述和要求 按照国际象棋的规则,一个皇后可以攻击与之处在同一行或是同一列或同一条斜线上的其他任何棋子。则n皇后问题的要求为,在一个n×n的棋盘上放置n个皇后,使得任何两个皇后不能被放在同一行或同一列或同一条斜线上。 回溯法原理 回溯法可以系统地搜索一个问题的所有解或任一解。它在包含所有问题的解空间树中,按照深度优先策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先回溯;否则,进入该子树

milk_aquarium的博客 9255

1173:阶乘和

1173:阶乘和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6010 通过数: 3049 【题目描述】 用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。 输入正整数n,输出计算结果S。 【输入】 一个正整数n。 【输出】 计算结果S。 【输入样例】 5 【输出样例】 153 思路: ...

zqhf123的博客 1261

回溯法解决N皇后问题(C语言)

#include<stdio.h> #include<stdlib.h> //存放皇后节点的队列 int queen[5] = {0}; //line和list的映射 int n =4 ; int counts = 0; //跟该行以前的行的皇后作比较...

5928

MATLAB机械臂轨迹规划:在关节空间中生成多项式轨迹以及 jtraj函数(内容超详细讲解)

matlab机器人仿真,关节空间多项式轨迹生成

qq_40969179的博客 1万+

知识图谱设计简记

知识图谱是一种语义化的知识表示框架,通过实体-关系-属性三元组形式表达现实世界关联。其核心价值在于关联化整合数据、支持可解释性推理和赋能智能化应用。知识图谱可分为通用型和领域型两类,基本构成包括实体、关系、属性等基础元素,以及本体和实例等架构层元素。设计方法主要有自上而下、自下而上和混合式三种,需遵循业务导向、一致性等原则。在建模时需要明确属性与实体的判断标准,规范处理关系的方向性与对称性,并合理构建多重关系。主流技术框架如RDF和属性图体系均支持多重关系建模,选择需考虑业务需求。本体作为知识图谱的概念骨架

生活在别处 360

回溯法与N皇后问题

回溯法 回溯法是用来解决这样的问题:在相对于问题的输入规模按照指数速度增长的域中,找出一个具有指定特性的元素,如在图顶点的所有排列中求一个哈密顿回路,或者背包问题。 回溯法实际上是对穷举查找的优化。它通过对所做的选择构造一颗所为的空间状态树来实现。具体来说,树的根节点表示在查找前的初始状态,树的第一层节点表示对解得第一个分量做的选择,以此类推。如果一个部分的构造解仍然有可能导致一个完整解,我...

zpznba的博客 7040

【YOLOv13多模态融合改进】| CFT:跨模态融合Transformer | 利用Transformer的自注意力机制,解决跨模态融合中的长距离依赖和全局信息整合问题

本文记录的是利用 CFT 模块改进 YOLOv13 的多模态目标检测网络模型。的设计出发点在于解决传统多模态检测中跨模态特征融合不充分的问题,即当不同模态数据需协同检测时,基于CNN的方法因局部卷积的局限性,难以捕捉长距离依赖和全局模态间的互补信息,导致复杂光照、遮挡等场景下检测精度不足。本文利用模块,将多模态特征序列拼接后自动学习模态内与模态间的交互权重,在特征提取阶段整合全局上下文信息,增强对不同模态互补特征的利用能力,从而提升模型在多模态场景下的检测鲁棒性与准确性。Cross-Modality Fus

Limiiiing的博客 540

N皇后问题(c语言实现)

问题描述: 有一个n*n的棋盘,在这个棋盘中放n个皇后,使得这n个皇后,任意两个皇后不在同一行,同一列,同一条对角线。例如,当n等于4时,有两种摆法。 输入只有一个整数n。 思路 如果我们是从这个n*n这个棋盘中选取n个方格放皇后,再去判断是否满足条件的话,则效率会非常低,这是一个组合数∁\complement∁nn∗nn \atop n*nn∗nn​,当n等于8时,就要枚举54502232次 ...

qq_45249273的博客 2万+

13、控制依赖与切片的新基础及递归While程序的摘要

本文探讨了控制依赖和程序切片的新研究进展,并提出了一种用于递归While程序的广义过程摘要概念和验证框架。文章介绍了控制依赖的新定义及其优势,程序切片的相关工作,以及递归While程序的过程摘要在完全正确性和终止性证明中的应用。通过阶乘和插入排序程序的示例分析,展示了过程摘要的有效性。未来的研究将聚焦于并发程序的依赖计算、依赖关系的语义连接以及时间属性的保留。

kotlin6android的博客 86

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 461

回溯法求解八皇后问题

问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。   问题历史:八皇后问题最早是由国际象棋棋手马克斯·贝瑟尔于1848年提出。之后陆续有数学家对其进行研究,其中包括高斯和康托,并且将其推广为更一般的n皇后摆放问题。八皇后问题的第一个解是

知之可否 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

回溯法解决n皇后问题

1、算法描述:        回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。(说白了就是从一条路往前走,能进则进,不能进则退回来,换一条路再试。)        回溯法的基本行为是...

lihhh520的博客 5303

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

n皇后问题-c语言实现

2019DFS深度遍历

weixin_51262054的博客 7995

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C语言】——n皇后问题详解

题目描述:八皇后问题 n个皇后两两不在一行,不在一列,不在同一对角线上 1.方法1 ——暴力法 /* * n皇后问题 —— n个皇后两两不在一行,不在一列,不在同一对角线上 * 两种方法: 1、暴力法 2、回溯法 */ #include <stdio.h> #include <stdbool.h> #include <math.h> #include <stdlib.h> #define n 8 bool hash[n+1]; int p[n

咭咭熊的博客 1327

回溯法解决N皇后问题 C语言

问题描述: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 回溯法: 回溯法又称试探法。回溯法的基本做法是深度优先搜索。即从一条路往前走,能进则进,不能进则退回来,换一条路再试。 源代码: #include&l...

weixin_30466421的博客 1208
上一篇: 回溯法经典例题--求解装载问题--C语言
下一篇: 回溯法经典例题--求解图的m着色问题--C语言
Max饼干碎
博客等级 码龄5年 28粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值