八皇后问题的递归与非递归算法

[回溯法]八皇后问题的递归与非递归算法 八皇后的问题非常有名,初次理解可能稍有难度,不过多看书,看博客和代码,几遍下来,也基本清晰。首先不用想初始的情况,先假设前面已经排列好了几个皇后,即将排列下一个皇后。依次遍历八个位置,然后与之前的进行判断这个位置是否可行,如可行则进行下一个皇后,否则则移动位置继续判断。很简单。但是有两个个问题:1、不全,某个位置有八种方法排列,你只用了一种,当然你可以每个位置遍历,但太耗时,回溯法可以解决很大的一部 阅读详情

八皇后问题的递归与非递归算法

问题:设在初始状
态下在国际象棋棋盘上没有任何棋子(皇后)。然后顺序在第1行,第2行,…。第8行上布放棋子。在每一行中有8个可选择位置,但在任一时刻,棋盘的合法布局都必须满足3个限制条件,即任何两个棋子不得放在棋盘上的同一行、或者同一列、或者同一斜线上。

1.非递归算法:

q[n]:q[i]代表第i行的皇后在第i列
在每行插入皇后时,检查是否存在攻击。
1.检查不同列:q[i]!=q[j]
2.检查不在同一斜线上:abs(q[i]-q[j])!=abs(i-j)
abs代表正斜线反斜线都不在他们上面。

bool check(int j)//当前要插入皇后的行数 
{
	int i=0;
	while(i<j)
	{
		if(q[i]==q[j]||abs(q[i]-q[j])==abs(i-j))
		{
			return false;
		}
		i++;
	}
	return true;
}

完整代码如下:

#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#define n 8
int q[n]={-1};//第i行上的皇后在第几列
int cnt=0;
void print()
{
	int i,j;
	for(i=0;i<n;i++) 
	{
		for(j=0;j<n;j++)
		{
			if(q[i]==j)
			{
				printf("1 ");//皇后放置 
			}
			else
			{
				printf("0 ");//无皇后放置 
			}
		}
		printf("\n");
	}
	printf("\n");
}
bool check(int j)//当前要插入皇后的行数 
{
	int i=0;
	while(i<j)
	{
		if(q[i]==q[j]||abs(q[i]-q[j])==abs(i-j))
		{
			return false;
		}
		i++;
	}
	return true;
}
void queen()
{
	int i=0;
	while(i>=0)//直到回溯到第一行也找不到可以放置皇后的位置,函数结束
	{
		q[i]++;
		while(!check(i)&&q[i]<n)
		{
			q[i]++;//找到这一行能够放置皇后的列数
		}
		if(q[i]<n)
		{
			if(i==n-1)//最后一行也成功放置皇后,找到一个解
			{
				cnt++;
				print();
			}
			else
			{
				i++;
			}
		}
		else
		{
			q[i]=-1;//第i行到最后也没有找到合适的位置,初始化本行的列数
			i--;//回到上一行,从下一列开始寻找
		}
	}
}
int main()
{
	queen();
	printf("有%d种布局",cnt);
	return 0;
}

2.递归算法
col[n]:列上放的皇后
md[2n-1]:主对角线
sd[2
n-1]:次对角线
q[n]:第 i行上的皇后在第几列

将上面的数组col,md,sd初始化为0,存放皇后后设置为1
当(col[j]!=1)&&(md[i+j]!=1)&&(sd[7+i-j]!=1)(i代表行,j代表列)
即代表此处可以放置皇后。
完整代码:

#include <stdio.h>
#include <stdbool.h>
#define n 8
int col[n]={0};//列上放的皇后 
int md[2*n-1]={0};// 主对角线 
int sd[2*n-1]={0};//次对角线 
int q[n];//第 i行上的皇后在第几列
int cnt=0;
void print()
{
	int i,j;
	for(i=0;i<n;i++) 
	{
		for(j=0;j<n;j++)
		{
			if(q[i]==j)
			{
				printf("1 ");//皇后放置 
			}
			else
			{
				printf("0 ");//无皇后放置 
			}
		}
		printf("\n");
	}
	printf("\n");
	cnt++;
}
void queen(int i)
{
	int j; 
	for(j=0;j<n;j++)
	{
		if((col[j]!=1)&&(md[i+j]!=1)&&(sd[7+i-j]!=1))
		{
			q[i]=j;//放皇后
			col[j]=1;
			md[i+j]=1;
			sd[7+i-j]=1;//标记放皇后的位置 
			if(i<n-1)
			{
				queen(i+1);
			}
			else
			{
				print();
			}
			col[j]=0;
			md[i+j]=0;
			sd[7+i-j]=0;//清除标记,开始下一组查找 
		}
	}
}
int main()
{
	queen(0);
	printf("有%d种布局",cnt);
	return 0;
}
递归算法——八皇后问题 python 递归算法——八皇后问题python 阅读详情

相关推荐

python八皇后问题,递归算法

python八皇后问题,递归算法问题描述思路代码运行结果 问题描述 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,输出所有摆法。 思路 每个皇后都不处于同一行、一列,可以用一维数组来表示皇后的位置,如a[0]=3表示皇后在第一行第四列,用一维数组可以保证皇后不会在同一行中。 判断冲突,如果同列,数组中的元素会有平相同,如果同斜线,2皇后位...

Mtostart 2565

算法设计与分析-回溯法思想的应用(头歌实验)

算法设计与分析—头歌实验

qq_62524881的博客 9057

算法学习笔记之三:八皇后问题(递归、回溯)

(一)题记 从去年下半年开始找工作,大大小小也被“鄙”试、“面”试了n多回了。说实话只怪自己并未对常见的笔试题、面试题进行准备,导致败下阵来。一门学问要想学透学精是需要时间的,慢慢来吧…… 第一次听到“八皇后”问题是在参加百度计算机视觉算法工程师面试时听中科院来面试的一个博士说的,当时隐约记得他是搞机器学习、模式识别的,所以自己以为这是很难的一个问题,回来简单想了一下也就没有细究。到后来去本行

只要踏出一步,路就在前方——zssure 4万+

N皇后问题非递归求解(利用对称性优化)

N皇后问题是一个老掉牙的问题了,随便翻一本算法书籍都能看到对它的介绍,其实N皇后问题可以用非递归方法解决,有效避免N过大时的递归工作栈溢出,且占用的存储空间较小,运行速度也较快,达到运行速度和空间合理利用的两全,代码很简单,并不复杂,有时简单也是一种美,意味着可靠和高效。追求程序的复杂和难以理解的编程者不会认同这一点,但对用简单的设计就可以解决的问题用复杂的数据表示加以描述是没有必要的。 我们可以利用对称性解决N皇后问题: 对于n皇后问题的任意解,把它相对于棋盘中线做对称变换,即让N皇后解中任意一个皇后

naturerun的博客 4463

八皇后问题(递归,回溯算法)

八皇后问题 问题介绍:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1884年提出:在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行同一列或者同一直线上问有多少种摆法。 思路 1.第一个皇后先放在第一列 2.第二个皇后放在第二行第一列,然后判断是否OK(及判断是否冲突),如果不OK,继续放在第二列,第三列,依次...

YUYING 724

八皇后问题--递归回溯算法(Python实现)

前两天做牛客的时候遇到了一个字符串的全排列问题。顺便回顾一下八皇后问题。(后附Python代码)如何解决八皇后问题?所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后......如果某一层看遍了所有格子,都无法成功摆放...

weixin_40411446的博客 7697

回溯法拓展2 educoder

第1关:非递归实现皇后问题 任务描述 本关任务:在n×n格的棋盘上放置彼此不受攻击的 n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。用非递归算法解决该问题。 ...

qq_46675545的博客 2243

非递归法实现n皇后问题

本资源是数据结构中利用非递归法实现n皇后问题的一个C++代码,仅供参考,欢迎指正

n皇后问题的解法

一、 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 下面是算法的高级伪码描述,这里用一个N*N的矩阵来存储棋盘:       1) 算法开始, 清空棋盘,当前行设为第一行,当前列设为第一列       2) 在当前行,当前列的位置上判断

Ethan的博客 1376

Python+QMT量化交易实战:从零搭建你的第一个极速策略(附完整代码)

本文提供了一份详细的Python+QMT量化交易实战指南,手把手教你从零搭建一个可回测、可实盘的极速策略。内容涵盖环境配置、QMT核心机制解析、双均线策略的完整代码实现、回测优化方法以及实盘部署要点,帮助量化交易新手快速入门并掌握核心开发流程。

b9c0d的博客 1003

cMake编译 VS2026+opencv4.12.0+opencv_contrib-4.12.0

本文提供了OpenCV 4.12.0集成CUDA、cuDNN和ONNX Runtime的详细编译指南。主要步骤包括:准备Visual Studio 2026、CMake 4.2.0、CUDA 12.6和cuDNN 9.16.0;设置无空格和中文的路径结构;配置关键CMake变量(如开启CUDA支持、指定路径等);以及最终的编译安装过程。注意事项包括:版本一致性检查、cuDNN文件复制、国内用户需手动获取.cache文件等。文章还提供了常见问题解决方案,如通过设置CUDA_NVCC_FLAGS参数解决VS版本

weixin_46624734的博客 1379

递归算法之八皇后问题

递归算法之八皇后问题

weixin_58473601的博客 5399

手把手教你为STM32设备生成自定义MAC地址(基于芯片ID的5种算法对比)

本文详细介绍了基于STM32芯片ID生成自定义MAC地址的5种算法,包括直接截取、异或折叠、CRC32哈希、自定义混合运算及SHA-256摘要。通过对比分析各算法的计算复杂度、唯一性及适用场景,帮助嵌入式开发者根据项目规模与资源,选择最合适的方案,确保设备MAC地址的唯一性与合规性。

weixin_29170327的博客 518

算法:递归与回溯算法解决八皇后问题

算法:递归与回溯算法解决八皇后问题什么是回溯算法如何用递归实现回溯算法(八皇后问题)八皇后问题的要求基本思想代码实现完整代码实现八皇后问题的完整代码 什么是回溯算法 在没有其他算法的加持下时,回溯算法简单来说,就是不断试错的过程。通过不断向下一个节点枚举寻找满足条件的答案,当无法寻找到时,则返回至上一个节点,然后继续向下枚举。 这句话可能看起来有点抽象,我们用一个图来演示一下。 这是一张A村到E村的地图。假设你从起点A出发到终点E(不是E1),在不知道路怎么走且时间、精力充足的情况下,你会选择一条条路走过去

ninelie's blog 1444

利用setEcoMode优化innovus中的ecoAddRepeater批量操作效率

本文详细介绍了在Cadence Innovus工具中,如何利用setEcoMode命令的batchMode参数,显著提升ecoAddRepeater命令在批量插入buffer或inverter时的操作效率。通过合并重复的初始化和数据库更新开销,该模式可将大规模时序修复操作的执行速度提升数倍,并提供了完整的脚本示例与最佳实践,帮助后端设计工程师优化ECO流程。

mango的博客 506

beegfs源码分析

BeeGFS的客户端是由一个内核模块和两个系统服务组成的,这里咱们主要分析内核模块。由于BeeGFS的目录树解析,是在父目录DEntry里找子目录或文件DEntry,逐级迭代完成的,所以在Mount文件系统时,须要从管理节点获取根元数据节点的ID,而后再向根元数据节点查询根目录的DEntry的信息,为后续的目录解析打下基础。获取类似/data/beeond/data/dentries/38/51/root/#fSiDs#/文件fileId的父路径。1.1 FileID的生成。Session网络消息。

wfzy的博客 1910

递归算法求解八皇后问题实验报告

八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解。八皇后问题最早是由国际象棋棋手马克斯·贝瑟尔(Max Bezzel)于1848年提出。第一个解在1850年由弗朗兹·诺克(Franz Nauck)给出。

weixin_74188242的博客 1623

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

bfq05234214的博客 438

八皇后问题(递归回溯算法详解+C代码)

为了理解“递归回溯”的思想,我们不妨先将4位皇后打入冷宫,留下剩下的4位安排进4x4的格子中且不能互相打架,有多少种安排方法呢? 现在我们把第一个皇后放在第一个格子,被涂黑的地方是不能放皇后的: 第二行的皇后只能放在第三格或第四格,比如我们放在第三格: 这样一来前面两位皇后已经把第三行全部锁死了,第三位皇后无论放在第三行的哪里都难逃被吃掉的厄运。于是在第一个皇后位于第一格,第二个皇后位于第三格...

苍之羽 2万+

【软考】系统集成项目管理工程师(一)信息化知识

软考中级——系统集成项目管理工程师备考干货第一章:信息化知识。

商务合作 | 共同学习 | 携手共进 9万+

android studio 2022打开了v1 签名但是生成的apk没有v1签名问题

我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。试着改小一下minSdkVersion 为23重新编译apk,再检测一下签名版本v1居然打开了!参考网上搜索到的方法,手动在build.gradle里面添加。但是编译出来的apk还是只有v2的签名。里面提到了v1签名还和。

hedalei的博客 460

关于python的八皇后问题递归算法详解

八皇后问题出自国际象棋:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串) 那么python怎么实现以及对于八皇后问题的求解呢?鉴于初学者水平只能讲讲递归回溯算法对于八皇后问题的求解 核心代码如下: def isNotConfic

DoKiDoK的博客 1789

jre9下载 jdk9

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

递归回溯算法解决八皇后问题

#递归回溯算法解决八皇后问题

amenga123的博客 552

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

递归算法之“八皇后问题”

一、八皇后问题 八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 下面的图片为八皇后问题的一种解法: 二、实现 在编写这个程序之前,我们先来思考几个问题: 1.棋盘怎么表达? 答:用二维数组来表示,并且,1表示有皇后,0表示无皇后。 2.如何判断当前位置(行、列)是安全的? 答:分...

weixin_44047196的博客 545

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

八皇后问题非递归回溯算法

八皇后问题非递归回溯算法 皇后不能在同一列,同一行,同一个主对角线,副对角线。 所以约束条件有4个 1.不在同一列 xi!=xj 2.不在同一个行A[i]!=A[j] 3.不在同一主对角线 xi-i!=xj-j 4.不在同一副对角线 xi+i!=xj+j 其中3与4条件可以简单化为abs(xi-xj)!=abs(i-j) #include<stdio.h> #include<math.h> int A[100]; int check(int n) { int i; for(i=1

octopu_prince的博客 693

python八皇后问题递归算法_Python实现八皇后问题示例代码

八皇后问题描述问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子。在一个棋盘上如果要放八个皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进一步的,所有)布局方式。首先,我们想到递归和非递归两类算法来解决这个问题。首先说说递归地算法。很自然的,我们可以基于行来做判断标准。八...

weixin_39640845的博客 351
上一篇: 中缀表达式求值
下一篇: 有效的数独
onlynb
博客等级 码龄5年 2粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值