八皇后问题之递归法求解

经典算法八皇后问题的详解以及回溯(递归)代码示例 对经典算法八皇后问题的说明,以及代码示例,代码中有详尽的注释,有助于读者充分理解其递归调用的逻辑! 立即下载

        我在上一篇博文【百度之星】变态的比赛规则中采用递归法解决了一个关于整数划分的问题,这里,再次使用递归法解决一个古老而有趣的问题——八皇后问题。

        八皇后问题是十九世纪著名的数学家高斯于1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案,1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果,对于八皇后问题,正确答案是有92种摆法。

        思路大致是这样的:八个皇后分别分布在八行当中,我们用Start(n)表示第n个皇后的位置选择,程序由Start(1)开始,显然,第一个皇后可以选择第一行的任意一个位置,当其位置选定后,调用函数Fanc(),对接下来的皇后位置选择作出限制,然后调用Start(2),第二个皇后选择一个位置,调用函数Fanc(),对接下来的皇后位置选择作出限制,然后调用Start(3)••••••当第八个皇后选定位置,并调用Start(9)时,说明已经得到一个结果,将其显示。

         如果第n个皇后没有可行选择,那就返回上一步,令第n-1个皇后重新选择位置。这就是回溯法的思想,尽量往下走,走不通再回来,选择其它走法。

        下面给出完整的C++源代码,代码已在VS2008下编译通过。有任何建议或者疑问,欢迎留言讨论。

       

#include <iostream>
using namespace std;

struct Queen             //皇后
{
       int x;
       int y;
};

struct ChessBoard        //棋盘
{
       bool XY[8][8];
};   

Queen MyQueen[8];       //共有八个皇后
ChessBoard MyChessBoard[8]; //准备八张棋盘
int N;                  //表示第N种放法

void print()                        //将所得结果显示出来
{
	cout<<"case "<<++N<<" : ";
	for (int i=0;i<=7;i++)
	{
		cout<<MyQueen[i].y+1<<" ";    
	}
	cout<<endl;
}

void Func(int x,int y,int step)    //在(x,y)位置上放置皇后后,将不可以放置皇后的位置置true
{
	MyChessBoard[step]=MyChessBoard[step-1];

	for (int i=0;i<=7;i++)      //横向和纵向
	{
		MyChessBoard[step].XY[x][i]=true;
		MyChessBoard[step].XY[i][y]=true;
	} 
	
	int tempx=x;
	int tempy=y;        //保存x,y的初始值
	
	while(x<8&&y<8)     //右斜向
	{
		MyChessBoard[step].XY[x][y]=true;
		x++;
		y++;
	}

	while(tempx<8&&tempy>=0)    //左斜向
	{
		MyChessBoard[step].XY[tempx][tempy]=true;
		tempx++;
		tempy--;
	}	
}

void Start(int step)
{
	if(step==9)
		print();    //得到了一种解法,将其显示。
	else
	{
		MyQueen[step-1].x=step-1;
		for (int i=0;i<8;i++)
		{
         if(MyChessBoard[step-1].XY[step-1][i]==true) continue;  //跳过
			MyQueen[step-1].y=i;
			if(step<8)
				Func(MyQueen[step-1].x,MyQueen[step-1].y,step);
			Start(step+1);
		}
	}
}

int main()
{
	Start(1);
	system("pause");
	return 0;
}

欢迎大家访问我的独立技术博客 道合|SameIdeal.com

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

相关推荐

用递归方法求解n皇后问题

print(int n):输出一个解。 place(int k ,int j):测试(k,j)位置能否摆放皇后

递归算法之八皇后问题

递归算法之八皇后问题

weixin_58473601的博客 5404

OpenRA引擎实战:如何从零开始搭建一个经典RTS游戏模组(附资源包)

本文详细介绍了如何利用开源游戏引擎OpenRA从零开始搭建经典RTS游戏模组。内容涵盖开发环境配置、资源管线处理、YAML规则定义、地图编辑与Lua脚本编写等全流程实战指南,并提供了资源包,帮助开发者和爱好者快速创建属于自己的即时战略游戏世界。

silver的专栏 905

八皇后问题(递归)

一、八皇后问题 八皇后问题, 是一个古老而著名的问题, 是回溯算法的典型案例。 该问题是国际西洋棋棋手马克斯· 贝瑟尔于1848 年提出: 在 8× 8 格的国际象棋上摆放八个皇后, 使其不能互相攻击, 即: 任意两个皇后都不能处于同一行、同一列或同一斜线上, 问一共有多少种摆法。 二、递归解决 1、思路分析 (1)第一个皇后先放第一行第一列; (2)第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适; (3)继续第三个皇后,还是第一列、

qq_44111805的博客 3147

抖音a_bogus参数逆向避坑指南:从环境检测到XHR请求的全流程解析

本文详细解析了抖音a_bogus参数在v1.0.1.19版本下的逆向工程全流程,重点介绍了如何通过PyV8Env框架进行有效的补环境操作,以绕过严格的环境检测。内容涵盖从环境初始化、关键事件触发到模拟XHR请求获取签名的完整步骤,并提供了可运行的Python代码示例和常见检测点的避坑指南,帮助开发者稳定生成有效的a_bogus参数。

tech5的博客 603

AIGC内容溯源技术:如何追踪AI生成内容的原始来源

本文旨在系统性地介绍AIGC内容溯源的技术体系,帮助读者理解如何追踪AI生成内容的来源。我们将覆盖从基础概念到前沿技术的完整知识链,包括但不限于数字水印、区块链存证、内容指纹等技术方案。文章将从AIGC的基本概念出发,逐步深入探讨各种溯源技术,分析其原理和实现,最后讨论实际应用和未来趋势。AIGC:AI Generated Content,人工智能生成内容内容溯源:追踪数字内容的创作、修改和传播历史数字水印:嵌入在数字内容中的不可见识别信息数字水印:隐藏在内容中的识别信息,像隐形墨水内容指纹。

SuperAGI2025 2072

八皇后问题,秒懂递归回溯(有图详解|c语言)

前言: 各位和我一样的刚学完递归的小白们,是不是突然遇见了一个大BOSS,八皇后问题!!把自信的说着“老子递归学好了!”的你一棒子打回了出生点,就像你刚玩只狼遇到的那个大胖子,刚玩原神遇到的雪山。今天,我就和大家一起学习一下这个著名的八皇后问题。

c0re的博客 2万+

智能车‘大脑’的诞生:揭秘电磁循迹代码背后的控制论与系统思维

本文深入探讨智能车电磁循迹系统的核心架构与控制原理,揭示了其作为精密闭环系统如何通过模块化设计、信号处理、PID控制算法及电机驱动实现自主导航。重点分析了电磁信号采集与处理流程框架,为开发者提供从理论到实践的全面指南。

arduino9maker的博客 532

图解八皇后问题(递归)

(以高斯为代表的许多数学家先后研究过这个问题。后来,当计算机问世,通过计算机程序的运算可以轻松解出这个问题) 题目描述 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 正确方法如图(其中一种放法) 本题采...

计算机科学与技术专业学生的成长之路 1万+

如何在Proteus中模拟Arduino

进一步的Proteus可用于设计任何与Arduino相关的项目,它将在进入硬件级别之前提供更好的理解。由于其广泛的库集合,它是Arduino社区中最受欢迎的工具之一,不仅如此,Proteus还可以为Arduino项目设计定制的PCB。就像上一步一样,现在搜索Arduino UNO板,选择Arduino板并单击“确定”以添加到项目中,或者双击以在Proteus项目中添加Arduino。一旦在Proteus中成功创建了一个新项目,现在我们将设计一个用于Proteus中闪烁LED的Arduino电路。

acktomas的博客 1万+

CST微带贴片天线设计全流程:从S11优化到辐射方向图分析

微带贴片天线是现代无线通信设备中的关键部件,其设计依赖于电磁场理论与仿真软件的结合。理解天线的基本工作原理,如谐振频率、阻抗匹配和辐射机制,是进行有效设计的基础。通过电磁仿真,工程师可以精确预测天线性能,避免传统手工计算的误差。在工程实践中,CST Studio Suite作为行业标准的三维电磁仿真工具,能够高效处理复杂的边界条件与材料属性,帮助优化S11参数和辐射方向图。本文聚焦于2.4GHz Wi-Fi频段微带贴片天线的完整设计流程,详细解析了端口设置、网格划分等关键步骤,并针对常见的仿真失败问题提供了

weixin_30784501的博客 459

C++递归法解决八皇后问题的超详细解答

博主初学C++数据结构与算法(清华大学出版社)第四版,由于程序清单5-2没有详细解答且代码不完整,思考了一个早上才恍然大悟,深感自己阅读代码以及写代码能力的不足,并在此记录,同时也希望也能帮到有需要的人! 1、什么是八皇后问题? 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。例如下左图所示: 可见,每个皇后所处...

gyros 3万+

Trae CN 使用入门指南

【代码】Trae CN 使用入门指南。

weixin_42551921的博客 8770

八皇后问题递归法求解

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

yangting09032214的博客 546

车载诊断架构 --- 车载ECU开发中DTC数量与芯片存储能力的关系及应对策略

本文探讨了汽车电子系统中ECU存储DTC故障码的容量问题及解决方案。作者作为汽车电子工程师,针对台架测试中遇到的DTC存储超限案例展开分析,指出随着汽车智能化发展,ECU需处理的DTC数量激增与芯片存储能力有限的矛盾。文章详细介绍了DTC的存储需求、ECU支持数量与芯片容量的关系,并提出应对策略,通过实际案例验证了方案的可行性。最后强调在ECU开发中需合理分配存储资源,确保关键故障信息不丢失。

Soly_kun的博客 87

计算机控制技术及应用

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

八皇后问题 递归求解法

#include <iostream> #include <fstream> #include <string.h> /** 八皇后问题递归方法实现 */ using namespace std; ofstream file; //用以计数计算结果的数目 int count = 1; /** 打印的棋盘其中...

weixin_34194551的博客 129

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

八皇后问题 递归求解法

#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string.h&gt; /** 八皇后问题递归方法实现 */ using namespace std; ofstream file; //用以计数计算结果的数目 int count = 1; /** 打印的棋盘其中打印1的位置是皇后...

weixin_34379433的博客 139

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

八皇后问题 _ 递归枚举排列法

//八皇后问题初试 //根据8个皇后在不同行不同列 //步骤:填第一行的皇后、填第二行的皇后(不能与之前的同列)、...、填第八行的皇后 //相当于 枚举排列:12345678表示第i(1-8)行皇后在第i(式子里分别代入)列 //排列出一个后,判断是否处于对角线的 //2020/3/31 #include <iostream> #include <cstring> #...

大锤 501

八皇后问题

#include using namespace std; #define max 15 void show(); bool check(int); void putQueen(int); int queen[max],sum=0; void main() { //首先放置第一个皇后 putQueen(0); cout<<"一共有"<<sum<<"种结果"<<endl; } void s

守望幸福的专栏 571

循环语句python_Python 循环语句

SonnetoAB胜于蓝|优秀个人博客gra***nnet@qq.comoAB胜于蓝|优秀个人博客oAB胜于蓝|优秀个人博客67八皇后问题 (循环递归法)oAB胜于蓝|优秀个人博客#* queen problem with recurisonBOARD_SIZE = 8def under_attack(col, queens):left = right = colfor r, c in rever...

weixin_39850167的博客 73

循环搭配递归解决八皇后问题

经典的八皇后问题,即在一个8*8的棋盘上放8个皇后,使得这8个皇后无法互相攻击( 任意2个皇后不能处于同一行,同一列或是对角线上),输出所有可能的摆放情况。 思路一 纯暴力 一共有264 种可能。所以暴力法并不是个好办法。 最基本的优化:如果当前皇后不满足条件,那么就停止继续往下查找,采用回溯 思路二 在最开始做这道题时,我想到的优化方法是首先排除在同一行的情况,于是我创建了一个一维数组queen...

# Never Give up & 360

八皇后问题的求解

在每一步尝试将一个皇后放置在当前行的每一列,如果该位置合法(即不与之前放置的皇后冲突),则继续递归到下一行。在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。如果当前位置可以放置皇后,将皇后放置在该位置(即将 huanghou[row] 设为 cols),然后递归地尝试在下一行放置皇后。如果在某一位置无法放置皇后,则回溯到上一行,改变上一行皇后的位置,继续试探其他可能性。如果成功将所有行都放置了皇后,则记录当前的棋盘布局作为一个解法。

2302_81205441的博客 1361

算法之递归法(汉诺塔问题)

递归法 特性(直接或间接地调用自己本身) 求解规模为n的问题可以转化为一个或多个结构相同、规模较小的问题,然后从这些小问题的解能方便地构造出大问题的解 递归调用的次数必须是有限的 必须有结束递归的条件(边界条件)来终止递归 计算递推式通常有3种方法 替换方法 要求首先猜测递推式的解,然后用归纳法证明 迭代方法 将递推式先转换成一个和式,然后计算该和式,得到渐进复杂度 公式法(主方法) 对于形如以下的递归方程,可以使用公式法,更加方便快捷地得到解 ????(????)=?????

lovelyGFR的博客 1855

利用回溯法解决八皇后问题(循环)

利用回溯法解决八皇后问题(循环) 2.用循环解决 #include <stdio.h> #include <stdlib.h> int a[20],n,sum; void output()//输出 { int i,j; for(i = 1; i<=n; i++) { for(j = 1; j<=n; j++) ...

JKR10000的博客 472

八皇后问题-递归回溯

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

StudyWinter的博客 570
下一篇: C#如何向oracle数据库中插入date类型的数据
Jocodeoe
博客等级 码龄15年 37粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值