八皇后及n皇后问题

C++递归问题之二——n皇后问题:以四、八皇后为例,给定n个皇后要求将它们放在一个n维矩阵中,任意两个皇后不能出现在同一行、列、主副对角线上,输出具体的摆放方式 #include using namespace std; class Queen{ public:  Queen(){}  Queen(int i):Qnum(i){}  ~Queen(){}  void SetQnum(int i){   Qnum=i;  }  void FindPos(); private:  enum{MAX=10};  int col[MAX 阅读详情
 

八皇后问题

是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。

历史

八皇后问题最早是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。之后陆续有数学家对其进行研究,其中包括高斯和康托,并且将其推广为更一般的n皇后摆放问题。八皇后问题的第一个解是在1850年由弗朗兹·诺克给出的。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。1874年,S.冈德尔提出了一个通过行列式来求解的方法,这个方法后来又被J.W.L.格莱舍加以改进。

艾兹格·迪杰斯特拉在1972年用这个问题为例来说明他所谓结构性编程的能力。

八皇后问题出现在1990年代初期的著名电子游戏第七访客中。

八皇后問題的解

八皇后问题一共有 92 个互不相同的解。如果将旋转和对称的解归为一种的话,则一共有12个独立解,具体如下:

解的个数

下表给出了 n 皇后问题的解的个数包括独立解U(OEIS中的数列A002562)以及互不相同的解D(OEIS中的数列A000170)的个数:

n

1

2

3

4

5

6

7

8

9

10

11

12

13

14

..

24

25

26

U:

1

0

0

1

2

1

6

12

46

92

341

1,787

9,233

45,752

..

28,439,272,956,934

275,986,683,743,434

2,789,712,466,510,289

D:

1

0

0

2

10

4

40

92

352

724

2,680

14,200

73,712

365,596

..

227,514,171,973,736

2,207,893,435,808,352

22,317,699,616,364,044

 

可以注意到六皇后问题的解的个数比五皇后问题的解的个数要少。现在还没有已知公式可以对 n 计算 n 皇后问题的解的个数。

程序

/* 
* Copyright (c) leo 
* All rights reserved. 
* filename: nQueens
* summary : 
* version : 1.0 
* author  : leo 
* date    : 8.12.2011 
*问题:
*	在n*n (n=1 or n>=4 )的棋盘上放置n个皇后,如果在同一行,同一列,同一对角线上都不存在两个皇后,
*	那么这个棋盘格局就是n皇后的一个解。
*要求:
*	找出n皇后的一组解即可,打印出放置满足n皇后条件的棋子位置
*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
#define N 8  //皇后数=棋盘行列数
int a[N];     //a[i]为第i行皇后所在列
void show()   //图形化输出
{
	int i;
	int p,q ;
	int b[N][N]={0};
	static t=1;
	printf("第%d个解为: ",t++);
	for(i=0;i<N;i++)
	{
		b[i][a[i]]=1;
		printf("(%d,%d) ",i,a[i]);
	}
	printf("\n");
	for(p=0;p<N;p++)
	{
		for(q=0;q<N;q++)
		{
			if(b[p][q]==1)
				printf("●");
			else
				printf("○");
		}
		printf("\n");
	}
}
int check(int n) //满足条件返回1,否则返回0
{
	int i;
	for(i=0;i<n;i++)
	{
		if(a[i]==a[n]||fabs(n-i)==fabs(a[i]-a[n])) //at the same column or diagonal (对角线)
			return 0;
	}
	return 1;
}
void put(int n) //在第n行放置第n个皇后
{
	int i;
	if(n==N)
		return ;
	for(i=0;i<N;i++)
	{
		a[n]=i;
		if(check(n))   //位置合法
		{
			if(n==N-1) //皇后全部放置完毕
				show();
			else
				put(n+1);
		}
	}
}
int main ()
{
	put(0);
	return 0;
}


 

參考資料

Watkins, John J. (2004). Across the Board: The Mathematics of Chess Problems. Princeton: Princeton University Press. ISBN 0-691-11503-6.

O.-J. Dahl, E. W. Dijkstra, C. A. R. Hoare Structured Programming, Academic Press, London, 1972 ISBN 0-12-200550-3 see pp 72-82 for Dijkstra's solution of the 8 Queens problem.

 

八皇后与N皇后问题并行算法设计及源码实现 简介:八皇后问题是在8×8棋盘上放置八个皇后,使其互不攻击的经典约束满足问题,常用于展示回溯法与并行算法的设计思想。本资源包含基于C语言的回溯算法实现(queen.c)及其扩展版本N皇后问题(queenN.c),支持不同规模棋盘的求解。通过编译生成的可执行文件(queen.exe、queenN.exe),可运行并验证算法性能。此外,项目引入并行计算技术如OpenMP或MPI,利用多核或分布式系统提升求解效率,适用于学习串行与并行算法对比、任务划分策略及高性能计算实践。 阅读详情

相关推荐

AstrBot插件开发全攻略:从零编写一个天气查询插件(Python实战)

本文提供了一份详细的AstrBot插件开发实战指南,手把手教你使用Python从零编写一个智能天气查询插件。内容涵盖插件系统核心设计、开发环境搭建、API调用与数据处理、自然语言交互实现以及插件打包发布全流程,帮助你快速掌握基于AstrBot框架的聊天机器人功能扩展技能。

weixin_29212867的博客 1082

四皇后问题(多种方法)

问题描述: 以4皇后为例,其他的N皇后问题以此类推。所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子。在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平、竖直、以及45度斜线上都不能出现皇后的棋子。 回溯法:dfs+迭代 1.如何判断当前位置的取值满足条件: 假设一个变量,每次设值都与前面已经设置好了的皇后的位置进行比较,是否同行同列,同斜线可以使用表达式:a[i]=a[j]=i-j || a[i]-a[j]=j-i 2.什么情况下成功找到四皇后的摆放位置: 当i&

lxy99的博客 1万+

多模态模型评测神器 | OpenCompass MMBench 了解一下!

MMBench 是 OpenCompass 研究团队自建的视觉语言模型评测数据集,可实现从感知到认知能力逐级细分评估。研究团队从互联网公开信息与权威基准数据集采集约 3000 道单项选择题 ,覆盖目标检测、文字识别、动作识别、图像理解、关系推理等 20 个细粒度评估维度。

OpenCompass的博客 7825

深入浅出讲解八皇后&n皇后问题

深入浅出讲解八皇后和n皇后问题规则分析第一种方式:问题分析代码如下1.0代码如下1.1第二种方式:代码如下1.2代码如下1.3 这次朋友想看,有是事解释讲解部分下次细说 该文章会从简单的程序开始讲解,也会涉及到一些算法(递归、回溯)、数据结构等一些知识,最后的程序是我现在为止想到的最优算法,讲解过程就是问题思考的过程 规则分析 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都...

weixin_43884534的博客 1066

HPC软件使用之ANSYS Fluent

本文介绍了如何在超级计算机上使用ANSYS Fluent进行科学计算和工程仿真。文章首先对Fluent软件进行了简要介绍,强调了其在计算流体力学领域的广泛应用和强大功能。接着,详细说明了如何编写jou脚本文件和slurm脚本文件,以控制Fluent的计算流程和作业提交。文章还提供了作业提交和查看的具体命令,并通过一个鼓风机仿真的案例演示了从网格模型准备、脚本编写、作业提交到结果查看的完整流程。最后,展示了使用Fluent进行结果可视化的方法。

欢迎各位大佬光临“寒舍”!请多多指点,共同进步! 2207

手把手教你学 Simulink (1.3):探索Simulink模块库的奇妙世界

Simulink模块库按照功能分为多个类别,每个类别包含专门用于特定任务的模块。% 打开Simulink库浏览器% 或者以编程方式获取库列表disp('可用的库列表:');end常用模块(Simulink):最基础和最常用的模块信号处理模块(DSP System Toolbox):专业信号处理工具通信模块(Communications Toolbox):通信系统设计控制系统模块(Control System Toolbox):控制系统设计与分析% 创建自定义模块库。

QQ_778132974的博客 381

【算法分析与设计】——八皇后问题的详解

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。     这个问题简化描述就是:在8x8的棋盘上放8颗子,要求它们【不

精灵的博客 1万+

Jenkins部署前后端分离项目最全图文教程(手把手教学)

最近Jenkins部署的热度比较高,于是就想出一篇关于我是如何使用Jenkins部署前后端分离项目的,本篇记录了我是如何一步一步去配置、搭建和部署的完整流程,每一行代码都进行了实测和讲解,通过图文的教学写成博客分享给大家!

黄团团的个人博客 4777

八皇后及其本质解

##八皇后问题 #include<stdio.h> int a[13][13]; int ans=0; int Setjudge(int i,int j,int n) //判断a[i][j]所在的斜线是否有棋子,0为有,1为无 { int flag=1; int i1; for(i1=0;i+i1<n&&j+i1<n;i1++) { if(a[i+i1][j+i1]==1) {

Rowon1的博客 476

本地部署AI应用:基于Google Gemini的banana-prompt快速上手指南

AI应用开发的核心在于将大模型能力集成到实际场景中,其原理是通过API调用将用户输入转化为模型可理解的指令,再由模型生成响应。这一技术价值在于降低AI应用开发门槛,实现数据本地化处理与隐私保护。在工程实践中,开发者常面临环境配置复杂、API集成繁琐等挑战。本文聚焦于使用banana-prompt工具包,通过TypeScript技术栈和npm包管理,快速在Windows本地部署基于Google Gemini API的AI应用。该方案特别适用于ai-prompts提示词工程和content-creation内容

weixin_27188815的博客 314

ERROR: Ignored the following yanked versions: 0.8.3, 0.10.19.dev18 的解决办法

关于这个问题,博主是在进行项目中的python依赖包安装的时候遇见的,遇到的异常:关于这个问题,是在。

Spring Boot-Common On With You 641

国际象棋皇后问题

皇后问题求解 (1)八皇后问题: (2)求解思路: (3)代码实现: #include &lt;iostream&gt; #include "Object.h" #include "LinkList.h" using namespace std; using namespace MyLib; template &lt;int SIZE&gt; class QueueSolu...

feiyan的博客 2973

PCL DBSCAN密度聚类【2026最新版】

点云密度聚类的PCL代码实现,与matlab自带的密度聚类算法进行对比验证,结果一致。3万多个点能再2秒左右运行出结果,算法效率尚可。

点云侠的博客 5681

八皇后和N皇后问题

(1)八皇后与N皇后问题 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。 八皇后问题可以推广到n皇后...

tingyuweilou的博客 673

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

N皇后问题(八皇后、四皇后)、猜字游戏问题

N皇后问题(八皇后、四皇后) 引言     八皇后问题为程序员入门编写程序的经典问题之一,大家需要理解清楚它的逻辑过程,代码量并不是很多,主要注重理解。 一、八皇后问题     在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。     下面我们先可以运用四皇后来一步一步分析问题,四皇后最终的规律也是和八皇后一样的,直接可以套

YING—country的博客 1924

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

八皇后——N皇后问题——图解 Java

思路:八皇后这么经典的问题相信大家都已经知道题目的意思了,那要怎么做呢? 看个例子:绿色这个点能存在的前提是,它的左下方的那条斜线上、右上方那条斜线上以及他所在的这一列和这一行上,都没有其他“皇后”,这样我们四个条件就出来了。 根据题目的意思我们最后要输出一个数组,拿题目所给的那个例子2,4,6,1,3,5意思是第一行的“皇后”应该放在第2列上,第二行的皇后放在第4列上,以此类推,因此我们就可以用一维数组来表示所有的状态即arr[i]=j 第i行的皇后应该放在第j列,用这种方式表示我们就可以不用判断同一行上

qq_44844588的博客 1631

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

八皇后时间复杂度_394,经典的八皇后问题和N皇后问题

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

weixin_39827036的博客 1764

蓝桥杯 八皇后 2n皇后问题

八皇后问题 正式讲解2n皇后问题之前,首先聊聊八皇后问题 题目很简单,8*8棋盘上放上八个皇后,不能放在同一行、列,或者是同对角线。 我在做这题的时候,首先没有参考别人的思路。第一反应是DFS来解决,用一个b[8][8]的数组来决定该位置上能不能放皇后。每放上一个皇后,就“占领”对应行和列、对角线。这样就可以避免冲突。 但是真正做的时候,我发现这种算法时间复杂度太大,基本超时,所以只能另辟蹊径。 于是去参考了别人的思路,常用的解法是 设置一个列数组col[8],上对角线数组sd[14],下对角线数组xd[[

highlighters的博客 974

八皇后、N皇后问题的求解。

注:main函数第一行把输出流定位到txt文件,可在源的目录下查看哦 #include #include #include using namespace std; #define N 11 int used_colunmn[N]={0};//记录已经占用的列 int a[N+1]={0}; int loop[N+1]={0}; void printqueen(int a[],int coun

yeze的专栏 701

Codeup 八皇后 n皇后问题

题目: 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。 给出一个数b,要求输出第b个串...

tangobravo的博客 338

八皇后时间复杂度_九章算法 | N皇后问题

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线)。给定一个整数n,返回所有不同的n皇后问题的解决方案。每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。在线评测地址:LintCode 领扣样例1:输入:1 输出: [["Q"]]样例2:输入:4 输出: [ // Solution 1 ...

weixin_39845406的博客 2971

C++八n皇后问题

要求解这一问题,最直接的方法就是穷举出8个皇后的所有摆放方法,然后依次检查其是否满足题中条件。棋盘共有8×8=64格,每次要选择8个格放皇后,因此总共有c=4426165368种组合。就算考虑到2个皇后无法同时出现在1行,即每行只能有1个皇后,那也有8的八次方1677216种组合。再加上2个皇后无法同时出现在1列,于是有8!=40320种组合。 相对地,使用下面所讲的回溯法求解八皇后问题,要远比遍...

qq_41979513的博客 341

GDPU|算法分析与设计 实验八 N皇后问题

一维数组解决N皇后问题,主要用回溯和递归,分别用C语言,C++。

2301_79904341的博客 679

n皇后问题与八皇后

这里的n皇后问题指在一个nxn的棋盘上放置n个棋子,使得每行每列和每条对角线上都只有一个棋子,求其摆放的方法数。 当且仅当n = 1 或 n ≥ 4 时问题有解。 class Queens { public: int sum=0;//排列方法数 //验证能否放棋子,n代表行数 bool Test(int chess[],int cur) { ...

许希律的博客 496

第1次实验——八皇后及N皇后问题

#include #include #include #include #include #define QUEENS 8 int iCount = 0; //!¼Ç¼½âµÄÐòºÅµÄÈ«¾Ö±äÁ¿¡£ int Site[QUEENS]; //!¼Ç¼»ÊºóÔÚ¸÷ÐÐÉϵķÅÖÃλÖõÄÈ«¾ÖÊý×é¡£ void Queen(int n); //!µÝ¹é

斯文仔的专栏 571

java实现八皇后以及n皇后问题详解

今天遇到一个非常有意思的问题就是八皇后问题 ,本人是一名菜鸟所以被难到了;进过学习以及自己琢磨研究出来一套解决方案但是时间复杂度有点高 希望各位大佬帮忙看看有办法解决吗 或者我这有什么错请指出来谢谢 //八皇后问题 /* 在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。 1) 对8 x 8的二维数组上的某点a[i][j](0<=i,j&l...

rentian1的博客 1045
上一篇: 博客网址大全
下一篇: 数据库操作封装
生无涯
博客等级 码龄16年 62粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值