八皇后递归算法

数据结构与算法 — 八皇后问题(回溯算法) 问题描述 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 假设上图中红点为一个皇后的位置,那么他的同行,列,斜线上都不能再放置其他皇后(也就是红线覆盖的位置) 此图为八皇后问题的其中一种解法,目前已经有人用图论的方法解出92种结果。 思路分析 一、如何实现 这就和我们人做这种题的时候一样,所有放置皇后的过程都是一行一行来的,首先将第一行的皇后放在第一个位置,然后再看第二行。最开始也是将第二行的皇后放在第二行的第一个位置,发现冲突 阅读详情

八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击。共有几种摆法?

基础知识:

国际象棋里,棋盘为8X8格。

皇后每步可以沿直线、斜线 走任意格。

思路:

1.想把8个皇后放进去,肯定最终每行只有一个皇后,每列只有一个皇后。

2.设个二维数组chess [ i ] [ j ] 模拟棋盘,cas存放摆法。i j 是表示i行j列:

在这里插入图片描述
写一个用于递归的函数,思路如下

3.从上往下一行行的放皇后,放下一行时从最左边(第0列)放起,如果不能放就往右挪一格再试。注意判断右边有没有越界出棋盘。

4.写一个函数专门判断当前位置能不能放,只需要判断该位置的横、竖、两对角线,这四条线上有没有其他皇后即可。命名为check。

5.如果把最后一行放完了,那就统计上这个摆法,cas++。摆完最后一行不能继续判断下一行了。

6.放完一种情况,还要探究其他情况,可以把现在放好的皇后“拿走”,然后再试探 之前没试探过的棋盘格。

7.拿走皇后操作可以和不能放皇后的操作用同样的代码实现:

如果这个位置不能放,要把它置零,表示没有皇后。

如果这位置能放,那就放皇后(置1)。等一种情况讨论完,还得把它拿开,“拿开”也是置零的操作。

所以应该想办法排列上述代码,保证已经把摆出的情况记录下来,之后执行“拿开皇后”代码。
下面是递归函数部分:

void queen(int i,int j){

if(j>=line){ //如果右侧越界
 return ;
}


    if(check(i,j)==1){//如果能放

    chess[i][j]=1;//放皇后

	 if(i==line-1){//如果是最后一行,记录情况
	 cas++;
	 }
	 else{
	 queen(i+1,0);//不是最后一行就分析下一行
 	}

    }
	//下面这两句是最精彩的
 chess[i][j]=0;//如果此位置不能放,就置空(0),判断旁边的格子。
 //如果此位置能放,走到这里就意味着上面的代码全部执行了,把皇后拿走(置零),再讨论其他情况,拿旁边位置试探。

 queen(i,j+1);
}

然后开始写判断函数check。需要判断的是8个方向,把它看成4条直线考虑。对于所在的横行,竖列,直接用for循环判断。接下来考虑对角线(红色)。

在这里插入图片描述

这样可以看出来,要判断的对角线是每个象限的平分线,每次 i ,j 的变化量是相等的,只是符号有差异。横纵坐标变化量的范围是-8~8,当对角线走到边框时停止判断。

为什么是-8到8呢?因为咱们没必要确定对角线的精确范围,上图是最理想的对角线,但是因为目标位置不同,对角线范围也不同,每次计算两端点是不可取的。

直接按最长对角线划:

在这里插入图片描述

核心代码:

for(k=-line;k<=line;k++){//两对角线

 if(i+k>=0&&i+k<line&&j+k>=0&&j+k<line)//从左上到右下对角线,如果在棋盘格里

 if(chess[i+k][j+k]==1) return 0;



if(i-k>=0&&i-k<line&&j+k>=0&&j+k<line)//从左下到右上对角线,如果在棋盘格里

 if(chess[i-k][j+k]==1) return 0;

}
 

这个判断函数不重要,你写的函数达到目的就行。

注意一点,此函数只能设计成判断功能,不可以改变棋盘格的填充。

我刚开始觉得,当放置完上一个皇后,直接把这皇后所在的横纵斜方向全部填充一个数字,列为‘‘禁地’’,下一皇后放置时只要看待放入位置是否是“禁地”即可。但这么做是错的,因为不是把棋盘格填好一次就ok了,摆好一次后还需要把最后放的棋子拿开,探讨其他情况。如果划分禁地后,拿走皇后还得把禁地复原了,很麻烦的说。。而且代码量也不节省,就这么判断就行。

代码块的思路讲完,下面是完整代码。运行结果:92.

#include<stdio.h>

#define line 8

void queen(int i,int j);

int check(int i,int j);

int chess[line][line];

int cas=0;
int xx,yy;


int main(){

queen(0,0);

printf("%d\n",cas);

return 0;

}



void queen(int i,int j){

if(j>=line){

return ;

}



if(check(i,j)==1){//如果能放

 chess[i][j]=1;//放皇后

 if(i==line-1){//如果是最后一行,记录情况

 cas++;
    /*下面是输出每种棋盘结果,供测试    
	 for (xx=0;xx<8;xx++) 

		 for(yy=0;yy<8;yy++){ 

		printf("%d",chess[xx][yy]); 

		if(yy==7) 

			printf("\n"); 

		} 

	 printf("\n");     

	上面是输出结果*/

}

else{

queen(i+1,0);//不是最后一行就分析下一行

 }

}

chess[i][j]=0;//如果此位置不能放,就置空(0),判断旁边的格子。

 //如果此位置能放,走到这里就意味着上面的代码全部执行了,把皇后拿走(置零),再讨论其他情况,拿旁边位置试探。

 queen(i,j+1);

}





int check(int i,int j){

int k;



for(k=0;k<line;k++){

if(chess[i][k]==1) return 0;//0=不能放

 }

for(k=0;k<line;k++){

if(chess[k][j]==1) return 0;

}

for(k=-line;k<=line;k++){//两对角线

 if(i+k>=0&&i+k<line&&j+k>=0&&j+k<line)//从左上到右下对角线

 if(chess[i+k][j+k]==1) return 0;



if(i-k>=0&&i-k<line&&j+k>=0&&j+k<line)//从左下到右上对角线

 if(chess[i-k][j+k]==1) return 0;

}

return 1;

}
递归算法(汉诺塔、八皇后) 小时候我们都听过一个故事:“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的故事是:"从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的故事是:"......耳熟能详的童谣却直接的表达递归的使用。 递归算法是指该算法直接或间接调用了自己的本身。一般递归的使用有两种场景: 1.问题的定义是递推的。(5的阶乘) public class a { //解题的关键是找到递归结束的条件 //5! = 5 * 4 * 3 * 2 * 1 public static long jiec.. 阅读详情

相关推荐

61、递归算法:从八皇后到前缀表达式求值

本文详细介绍了递归算法在多种问题中的应用,包括经典的八皇后问题和数独问题,使用递归回溯方法寻找解决方案;以及前缀表达式的递归求值方法。文章还总结了递归算法的特点、应用场景,并提供了多个练习题和编程项目示例,帮助读者更好地掌握递归算法的实现与优化。

o9p0q1的博客 64

八皇后问题(递归)

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

qq_44111805的博客 3146

飞凌OK3588-C Linux R4系统下MIPI YUV摄像头CSI尺寸错误排查与极性适配方案

本文详细介绍了在飞凌OK3588-C平台的Linux R4系统下调试MIPI YUV摄像头时遇到的'csi size err'错误排查与极性适配方案。通过分析信号极性、驱动参数调整及FPGA协同调试,提供了从硬件检测到系统级调试的完整解决方案,帮助开发者快速解决类似问题。

bean的博客 258

递归算法之八皇后问题

递归算法之八皇后问题

weixin_58473601的博客 5404

小程序强制更新避坑指南:手把手教你实现无缝升级

本文详细解析小程序强制更新的实现方法,重点介绍wx.getUpdateManager API的使用技巧,帮助开发者规避冷热启动机制下的版本管理陷阱。通过实战案例展示如何设计多级更新提示策略,确保用户无缝升级,提升小程序版本更新率。

star的博客 280

告别配置烦恼!保姆级教程:在Windows 10/11上为QT5.14.2配置MSVC2017编译器(附VS2022组件避坑指南)

本文提供了一份详细的保姆级教程,指导如何在Windows 10/11上为QT5.14.2配置MSVC2017编译器,包括VS2022组件避坑指南。从环境准备到关键配置,再到调试工具验证和Qt Creator中的编译器设置,一步步解决常见问题,帮助开发者快速搭建稳定可靠的开发环境。

weixin_30615767的博客 502

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

八皇后问题介绍 数据结构和算法内容介绍 八皇后问题算法思路分析 1. 第一个皇后先放在第一行第一列 2. 第二个皇后放在第二行第一列,然后判断是否ok,如果不ok,继续放在第二列,第三列,依次把所有列都放完,找到合适的 3. 继续第三个皇后,还是第一列,第二列。。。直到第八个皇后也能放在一个不冲突的位置,算是找到了一个正确解 4. 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯...

fishermanMr 1353

ADS实战指南:负载牵引(Loadpull)在射频功放设计中的关键应用

本文深入解析了负载牵引(Loadpull)技术在射频功率放大器设计中的核心作用与实战方法。通过生动的比喻和详细的ADS软件操作指南,阐述了如何通过系统扫描负载阻抗,在史密斯圆图上绘制等功率线与等效率线,从而精准找到最优阻抗点,以平衡输出功率与效率,是应对5G等现代通信系统严苛要求的必备技能。

weixin_29198045的博客 601

八皇后问题4种c语言算法

八皇后问题 1.递归回溯法 B站懒猫老师讲的(我在这里学的) 八皇后问题的递归回溯算法思路:从第一行开始当某一行皇后位置不与前面所有皇后位置冲突那么记录该行皇后位置并调用递归函数进入下一行,摆放下一个皇后,逐个位置摆放,若该行所有位置都被其他皇后占领,那么就回溯到上一行重新摆放上一行皇后直至所有皇后都不冲突那么记录一次方法然后回溯寻找其他摆放方法。 冲突算法思路:一个8*8的棋盘每一个位置若用其行号加上其列号我们可以得到下图,由图可知在同一条上对角线的数值都相同,因此我们可以利用该规律设计判断上对角线是否冲

yunProgrammer的博客 1万+

Dr_can Kalman Filter学习笔记(一)

本文是在b站Dr_can的卡尔曼滤波课程学习过程中的学习笔记

苏大侠的博客 1051

手把手教你学Simulink--移动机器人多轮协同场景实例:基于Simulink的双轮差速PMSM轮毂电机协同驱动仿真

本文介绍了基于Simulink的双轮差速PMSM轮毂电机协同驱动仿真系统。针对移动机器人存在的电机参数不一致、负载分配不均等问题,提出主从同步+力矩补偿的协同控制策略。通过搭建包含运动学模型、PMSM电机模型和矢量控制器的仿真系统,实现了速度同步误差<0.005m/s、轨迹跟踪误差<0.8cm、能耗降低12.5%的优化效果。文章详细阐述了建模步骤、核心算法实现和性能验证,为移动机器人动力系统设计提供了实用参考方案。

MHD0815的博客 133

八皇后及N皇后的回溯与递归算法

八皇后及N皇后的回溯与递归算法 // 8 queens #include int position[9]; // 第i个皇后的列号是position[i] (i:1-8) int check(int step){ int i; if(position[step]>8) return 0; for(i=1; i<step; i++){ if (

奋起的Coder。。。 1971

【skill】漫剧 AI 视频创作的知识库 + API 调用手册

方案适用场景在对话中使用,自动触发注入到任何 LLM(Cursor/Windsurf/Claude API)Python 模块集成到自动化管线/批量生成GitHub 又限速了,不过前几轮搜到的已经够用了。根据搜索结果,结合已分析过的项目,给你整理完整对比 🐮。

突围 984

八皇后-递归算法

八皇后-递归算法 1.问题表述 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。 2.思路分析 由于二维数组每行只放一个数组,我们可以用一个一维的数组来表示创建一个长度为8的数组,数组的值表示棋子放在第几列。下标0表示第一行,以此类推。例

qq_45660447的博客 305

innovus:InstPad、CellPad 、module padding、clock cell halo

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。

m0_61544122的博客 2024

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

八皇后递归算法c语言,ios使用OC写算法之递归实现八皇后

八皇后算法介绍知道国际象棋的朋友们应该知道里面的皇后是最厉害的角色,她可以上下左右通吃,和中国象棋里面的车(ju 一声)一样,但是她比车更强大,她可以在斜线上也做到通吃,而我们的八皇后问题其实简单来说就是如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后八皇后算法思路解析既然任意一个皇后都无法吃掉其他的皇后,也就是说任两个皇后都不能处于同一条横行、纵行或斜线...

weixin_36427002的博客 314

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

递归解决八皇后回溯算法

问题简述:八皇后问题是一个古来而著名的问题,该问题是19世纪著名的数学家高斯同学提出来的。在8*8的国际象棋上摆放八个皇后,使其不能互相的攻击,也就是说,任意的两个皇后不能放在同一行或则是同一个列或者是同一个对角线上,问有多少个摆放的方法 代码: package com.yg.recursion;/* @author GeQiLin @date 2020/2/24 20:30 求解8皇后...

lin1214000999的博客 224

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数据结构与算法 递归解决八皇后、迷宫问题

递归是比较好理解的,递归是解决问题比较常用的一个算法。递归可以解决想八皇后、汉诺塔、走迷宫这样的问题。

weixin_67773572的博客 339

八皇后算法 非递归 非栈

 #include #include #include #include #include #include #include #include #include using namespace std;//输出一个序列templatetypename Iter>void print(Iter first,Iter last,    

alain的专栏 1200

递归算法之八皇后

八皇后问题核心: 1:同一行或者同一列不能放置皇后; 2:斜率为1/-1的对角线上不能有两个皇后。 如图: 实现原理:     #include&lt;iostream&gt; #include&lt;cstdio&gt; using std::cout; using std::endl; int count = 0; int detection(int(*board)[8],...

zj490044512的博客 353

算法:递归(八皇后)

问题描述: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 代码: package indi.com.algorithms.recursion; import java.util.Arrays; public class Queen { //皇后总个数 int max = 8; //皇后...

qq_27493017的博客 151

基于递归回溯算法实现八皇后游戏问题

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

weixin_51757922的博客 284

数据结构与算法-递归(八皇后)

八皇后问题是一个典型的回溯法(Backtracking)问题,要求在一个8×8的国际象棋棋盘上放置八个皇后,使得任何两个皇后都不能处于同一行、同一列或同一斜线上。这是一个 NP 完全问题,没有已知的多项式时间解决方案,但可以通过搜索算法如递归来找到所有可能的解。八皇后问题生动地展示了递归算法如何巧妙地应对复杂问题,通过不断地试探和回溯,最终找到所有可能的解决方案。理解并掌握递归思想不仅有助于我们解决类似的问题,而且对于提升编程能力和抽象思维有着深远的影响。

m0_62988332的博客 1443

八皇后非递归 java_8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化...

上两篇博客研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高代码如下:packagecom.newflypig.eightqueen;importjava.util.Date;/*** 使用循环控制来实现回溯,解决N皇后*@authornewflydd@189.cn* Time : 2016年1月1日 下午9:37...

weixin_36343015的博客 274
上一篇: 汇编语言课后题答案
下一篇: 汇编语言测试题1
隔壁郑同学
博客等级 码龄8年 1005粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值