递归八皇后问题

八皇后问题(递归+非递归) 一.问题描述 在8×8格的国际象棋棋盘上放置八个皇后,使得任意两个皇后不能互相攻击,即任何行、列或对角线(与水平轴夹角为45°或135°的斜线)上不得有两个或两个以上的皇后。这样的一个格局称为问题的一个解。请用递归与非递归两种方法写出求出八皇后问题的算法。 二.解题思路描述 一个正确的解应当是每一列,每一行,每一条斜线上均只有一个皇后。 对于递归算法,本人才有模拟的方式进行 阅读详情

八皇后是递归算法中很经典的案例 下面分享一下八皇后具体实现方法

算法思路

  1. 第一个皇后先放在第一行第一列
  2. 第二个皇后放在第二行第一列,然后判断是否ok,如果不OK 就放在第二列、第三列…依次把所有列放完 找到一个合适
  3. 继续第三个皇后,还是先放第一列、第二列 依次类推 直到第八个皇后也放在了一个不冲突的地方,就算是找到了一个正确解
  4. 当得到一个正确解的时候 在栈回退到上一个栈时,就会开始回溯,即将第一个皇后放在第一列的所有正确解 全部得到
  5. 然后回头继续第一个皇后放第二列 后面继续循环执行1.2.3.4的步骤
    说明:理论上应该创建一个二维数组来表示棋盘 但是实际上可以通过算法用一个一维数组即可解决问题,arr[8]={0,4,7,5,2,6,1,3}对应arr小标 表示第几行 即第几个皇后,arr[i]=val,val表示第i+1个皇后,放在第i+1行的第val+1列

下面是代码实现

首先写一个判断是否冲突的方法

//判断我们的放置第n个皇后,就去检查皇后是否和前面的已经摆放后皇后冲突
    private boolean judge(int n)
    {
        for (int i = 0; i <n ; i++) {
            /*因为是一维数组所以直接排除了同一行的可能情况
            array[i]==array[n]判断是否在同一列:array[i]=val的值代表列
            Math.abs(n-i)==Math.abs(array[n]-array[i])
            可以看成是n-i行差等于array[n]-array[i]列差即斜率为1
            斜率为1即为同一斜线
            */
            if (array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])){
                return false;
            }
        }
        return  true;
    }

然后写一个递归放置的方法

    public void check(int n){
         if(n==max)//当n=8时说明已经将八个皇后放好了
         {
             print();
             return;
         }
        for (int i = 0; i < max; i++) {
            //先把当前的这个皇后n,放到该行的第一列
            array[n]=i;
            //判断当放置第n个皇后到i列时,是否冲突
            if (judge(n)){//不冲突
                //接着放n+1个皇后,即开始递归
                check(n+1);
            }
            //如果冲突就会继续执行array[n]=i,即将第n个皇后放在本行的后一个位置
        }
    }
    //打印数组的print方法
       public void print(){
        count++;
        System.out.printf("第%d种解法",count);
        for (int item:array){

            System.out.printf(" "+item);
        }
        System.out.println();
    }

最后调用测试一下

public class Queen8 {
    int max = 8;
    int count=0;
    int []array=new int[max];
    public static void main(String[] args) {
        Queen8 queen8=new Queen8();
        queen8.check(0);

    }

结果如下

在这里插入图片描述

递归算法——八皇后问题 python 递归算法——八皇后问题python 阅读详情

相关推荐

算法设计思维之递归与八皇后问题

计算机思维和人的思维最大的不同就是递归。我们日常思考问题方式是正向的递推(iterative),计算机是逆向的递归思维。要想真正理解的计算机解决问题的精髓,递归是必须要学的。

小谷王左的随笔空间 702

八皇后问题(递归)

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

qq_44111805的博客 3147

递归回溯解决八皇后问题

基于尚硅谷数据结构的笔记总结

jorsi的博客 1046

递归算法之八皇后问题

递归算法之八皇后问题

weixin_58473601的博客 5405

用递归解决八皇后问题,C++语言实现

用递归解决八皇后问题,C++语言实现 以下为具体实现过程。  --------------------------分割线------------------------------------- #includeiostream> using namespace std; const int qesz=8;//问题为qesz=8的皇后问题,修改qesz的大小可以解决N皇后问题。 c

happyp9的博客 2801

MATLAB机械臂建模实战:标准D-H法与改进D-H法到底选哪个?(附代码对比)

本文深入解析MATLAB中机械臂建模的标准D-H法与改进D-H法的本质区别,提供详细的代码对比和可视化结果。通过实际案例,帮助读者根据应用场景选择合适方法,并避免常见建模陷阱。特别关注Link函数和SerialLink工具的使用技巧,提升机械臂建模效率。

grape的博客 1121

递归——八皇后问题

用递归解决八皇后问题 问题描述 八皇后问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行,同一列或者同一斜线上,问由多少种摆法。 思路分析 第一个皇后先放在第一行的第一列 第二个皇后放在第二行的第一列,然后进行判断。判断什么呢?判断与前面所有的皇后是否会互相攻击。如果会互相攻击则换成第二列、第三列直到把所有的列放完,如果所有的列都放完还没有正确的解,则回溯上一个皇后的摆法。 重复第三步的动作,直到8个皇后全部摆完,就得

weixin_51506327的博客 470

域控制器开发避坑实录:从硬件设计到软件集成的5个关键挑战

本文深入剖析了域控制器开发中的5大关键挑战,从硬件选型到软件集成,涵盖智能驾驶芯片选择、实时性优化、AUTOSAR架构适配等核心问题。通过实战案例和数据对比,为工程师提供避坑指南,助力提升开发效率和系统可靠性。

weixin_29258297的博客 396

递归解决八皇后问题

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

实践求真知 829

UE4_用户控件_6_通过控件蓝图内部变量来修改进度条的值

发现控件类图类的引用和用户控类引用不兼容,修改变量类型。我们需要添加到视口,同时设置输入模式。创建按钮的点击事件,当点击时调用角色的自定义事件clearwidget。可以了,但是没有退出控件,没有鼠标,所以改进一下。

Growthofnotes的博客 1238

从GWAS到单细胞:利用seismic包精准定位疾病相关的关键细胞亚群与驱动基因

本文详细介绍了如何利用seismic包将GWAS与单细胞测序数据结合,精准定位疾病相关的核心细胞亚群与驱动基因。通过创新的统计算法和实战案例,帮助研究者从遗传汇总数据中挖掘关键生物学机制,提升疾病研究的精准度和效率。

weixin_29215815的博客 442

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

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

m0_62988332的博客 1443

用豆包+Skill从零制作AI漫剧:分镜、画面、配音到成片全流程

AI漫剧作为一种新兴内容形态,结合AI绘画与AI视频生成技术,正在改变短视频创作方式。其核心原理是利用提示词工程,将创意转化为结构化分镜脚本,再通过豆包等AI助手的Skill能力,将重复的脚本生成和分镜拆解流程固化为可复用的指令模板,从而大幅降低从构思到成品的生产门槛。这种模式无需剧组、演员和实景拍摄,让个人创作者也能借助图像生成、TTS配音与剪辑合成工具,批量化地生产剧情短片,适用于短视频平台连载、商业定制与个人IP打造。围绕豆包+Skill这条主线,从选题、剧本写作、分镜表设计,到画面提示词生成、视频片

weixin_29048309的博客 1539

图解八皇后问题(递归)

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

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

【Bluetooth|蓝牙开发】三、一篇文章,带你总览蓝牙协议

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

【WRF-Urban数据集】中国60个城市的1 km分辨率城市冠层参数(UCPs)

中国60个城市的1 km分辨率城市冠层参数(UCPs)

WW、forever的博客 1068

探究八皇后问题的递归与非递归解法

八皇后问题是一个经典的计算机科学问题,涉及在8x8的棋盘上放置八个皇后,使得它们彼此之间无法相互攻击。这个问题可以通过递归和非递归两种方法来解决,本文将详细介绍八皇后问题的规则、递归解法和非递归解法,并提供C++代码实现。

浪子回头 746

5套高颜值AI漫剧女主设定图!直接拿去做漫剧(附完整提示词)

左侧特写放大表现暖棕眼妆、豆沙唇、红宝石首饰、发丝与针织纹理,四个视图严格保持同一人物脸模、发色、服装、首饰和身体比例,柔和复古棚拍光,低饱和酒红与奶油色配色,真实布料、皮革、金属与宝石材质,高级精致角色资产设定图,高清8K。佩戴珍珠与透明水晶耳坠、纤细珍珠项链;左侧特写放大至胸部以上,清晰表现皮肤、眼妆、发丝、耳饰和针织材质,人物四个视图保持同一脸模、发型、服装、饰品和身体比例,柔和棚拍漫射光,轻微地面阴影,高级细腻材质,真实发丝,细腻皮肤,高精度角色资产设定图,高清8K质感。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1778

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

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

苍之羽 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

八皇后问题-递归求解

八皇后问题 在国际象棋的棋盘上,按照国际象棋的规则,摆放8个皇后,使之“和平共处”。如图所示,在3-D上有一个皇后,则绿色区域中都不能再放置皇后了。 最暴力的方法就是使用八个for,但是很明显,这种方法效率太低。 对于放置了皇后的位置,仔细观察棋盘可以发现每一列(行)只能有一个皇后,每一个主(次)对角线上也只能有一个皇后,这样需要标记:行-row,列-col,主对角线-(n+row-col),次...

HLdongdong的博客 8390

efm32 入门.pdf

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

八皇后问题之递归法求解

我在上一篇博文【百度之星】变态的比赛规则中采用递归法解决了一个关于整数划分的问题,这里,再次使用递归法解决一个古老而有趣的问题——八皇后问题。         八皇后问题是十九世纪著名的数学家高斯于1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案,1854年在柏林的象棋杂志上不同的

Jocodeoe的专栏 2235

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

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

八皇后问题的非递归解法

用C++实现了八皇后问题的非递归算法。原理很简单,看代码就是了,无须多说 #include #include #include #include using namespace std; const int MAX = 8; vector board(MAX); void show_result() { for(size_t i = 0; i < b

wangpengqi的专栏 1686

【C语言】使用递归解决八皇后问题

1、什么是八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机...

echoecho的博客 1147

[递归经典题目]八皇后问题

【经典题目】八皇后问题 题目:在2*2的国际象棋上摆放着8个皇后,shiqi

且听风吟 803

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

八皇后问题的递归与非递归算法 问题:设在初始状 态下在国际象棋棋盘上没有任何棋子(皇后)。然后顺序在第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代表正斜

onlynb的博客 2135

八皇后问题——递归精讲

我们先来实现一个非常熟悉的递归操作——阶乘 那么,不需要多说,相信好多同学都会想到如下代码: int factorial(int n) { if(n<0) { return -1; } return n == 0 ? 1 factorial(n-1); } 我们再来复习一个曾经学习C的时候编写过的一个程序——兔子繁殖问题(斐波那契额数列) 代码如下: int Fibonacc...

Java我们右转见 264
上一篇: 逆波兰表达式(后缀表达式)计算器的实现总结
下一篇: 冒泡排序-八大排序(一)
来来爱编程
博客等级 码龄7年 375粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值