【数据结构与算法 9】谁发明的八皇后,本宫赐你一丈红

2023-05-16

一、八皇后问题

八皇后问题,一个古老而著名的问题,是回溯算法的经典案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

二、基本思路

1、第一个皇后先放第一行第一列;

2、第二个黄瓜放在第二行第二列、然后判断是否OK,如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适的;

3、继续第三个皇后,还是第一列、第二列.....直到第八个皇后也能放在一个不冲突的位置,就算找到了一个正确解;

4、当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到;

5、然后回头继续第一个皇后放第二列,后面继续循环执行1、2、3、4的步骤;

三、代码实例

package dataStructure.recursion;

public class Queen8 {
    //定义一个max表示共有多少个皇后
    int max = 8;
    //定义数组array, 保存皇后放置位置的结果,比如 arr = {0 , 4, 7, 5, 2, 6, 1, 3}
    int[] array = new int[max];
    static int count = 0;
    static int judgeCount = 0;
    public static void main(String[] args) {
        //测试一把 , 8皇后是否正确
        Queen8 queen8 = new Queen8();
        queen8.check(0);
        System.out.printf("一共有%d解法", count);
        System.out.printf("一共判断冲突的次数%d次", judgeCount); // 1.5w
    }

    //编写一个方法,放置第n个皇后
    //特别注意: check 是 每一次递归时,进入到check中都有  for(int i = 0; i < max; i++),因此会有回溯
    private void check(int n){
        if(n == max) {  //n = 8 , 其实8个皇后就既然放好
            print();
            return;
        }

        //依次放入皇后,并判断是否冲突
        for (int i = 0; i < max; i++) {
            //先把当前这个皇后 n , 放到该行的第1列
            array[n] = i;
            //判断当放置第n个皇后到i列时,是否冲突
            if(judge(n)){
                //接着放n+1个皇后,即开始递归
                check(n+1);
            }
            //如果冲突,就继续执行 array[n] = i; 即将第n个皇后,放置在本行得 后移的一个位置
        }
    }

    //查看当我们放置第n个皇后, 就去检测该皇后是否和前面已经摆放的皇后冲突
    /**
     *
     * @param n 表示第n个皇后
     * @return
     */
    private boolean judge(int n) {
        judgeCount++;
        for (int i = 0; i < n; i++) {
            // 说明
            //1. array[i] == array[n]  表示判断 第n个皇后是否和前面的n-1个皇后在同一列
            //2. Math.abs(n-i) == Math.abs(array[n] - array[i]) 表示判断第n个皇后是否和第i皇后是否在同一斜线
            // n = 1  放置第 2列 1 n = 1 array[1] = 1
            // Math.abs(1-0) == 1  Math.abs(array[n] - array[i]) = Math.abs(1-0) = 1
            //3. 判断是否在同一行, 没有必要,n 每次都在递增
            if(array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i]) ) {
                return false;
            }
        }
        return true;
    }

    //写一个方法,可以将皇后摆放的位置输出
    private void print() {
        count++;
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}

四、控制台输出

验证一把:

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构与算法 9】谁发明的八皇后,本宫赐你一丈红 的相关文章

  • 以OpenGL/ES视角介绍gfx-hal(Vulkan) Shader/Program接口使用

    文档列表见 Rust 移动端跨平台复杂图形渲染项目开发系列总结 目录 背景 The right way to tackle this in Vulkan is to use resource descriptors A descriptor
  • netty handler的执行顺序(3)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 今天解决2个问题 1 handler在pipeline当中究竟是如何存储的 2 在遍历handler的过程中 会根据event的不同 调用不同的handler 这一点是如何
  • 算法--将数组分成和相等的多个子数组,求子数组的最大个数

    作者 陈太汉 一个整数数组 长度为n 将其分为m份 使各份的和相等 求m的最大值 比如 3 2 4 3 6 可以分成 3 2 4 3 6 m 1 3 6 2 4 3 m 2 3 3 2 4 6 m 3 所以m的最大值为3 算法 原理的思想是
  • 数据结构----链式栈

    目录 前言 链式栈 操作方式 1 存储结构 2 初始化 3 创建节点 4 判断是否满栈 5 判断是否空栈 6 入栈 7 出栈 8 获取栈顶元素 9 遍历栈 10 清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法 链接 线性表 栈 栈
  • 微软2013暑假实习生笔试题

    自己mark一下 以作后备 下面提交原文链接 原文博客 部分题目答案不确定 会持续更新 1 Which of the following calling convention s support s supportvariable leng
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • 数据结构与算法学习总结(六)——字符串的模式匹配算法

    基本概念 字符串是一种特殊的线性表 即元素都是 字符 的线性表 字符是组成字符串的基本单位 字符的取值依赖于字符集 例如二进制的字符集为0 1 则取值只能为 0 1 再比如英语语言 则包括26个字母外加标点符号 例如 abcde 就是一个字
  • 手把手教你实现一个向量

    文章目录 什么是向量 向量提供哪些接口 实现 宏定义 定义类 成员变量 构造函数与析构函数 构造函数 析构函数 成员函数 size get r put r e expand insert r e remove lo hi remove r
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • Python 实现列队

    1 列队定义 队列是项的有序结合 其中添加新项的一端称为队尾 移除项的一端称为队首 当一个元素从队尾进入队列时 一直向队首移动 直到它成为下一个需要移除的元素为止 最近添加的元素必须在队尾等待 集合中存活时间最长的元素在队首 这种排序成为
  • 『Python基础-15』递归函数 Recursion Function

    什么是递归函数 一种计算过程 如果其中每一步都要用到前一步或前几步的结果 称为递归的 用递归过程定义的函数 称为递归函数 例如连加 连乘及阶乘等 凡是递归的函数 都是可计算的 即能行的 递归就是一个函数在它的函数体内调用它自身 编程语言中的
  • JavaScript系列——数组元素左右移动N位算法实现

    引言 在自己刚刚毕业不久的时候 去了一家公司面试 面试官现场考了我这道题 我记忆深刻 当时没有想到思路 毫无疑问被面试官当成菜鸟了 最近刚好在研究数组的各种算法实现 就想到这道题 可以拿来实现一下 纪念自己逝去的青春 需求 假设有这样一个数
  • 图 - Java实现无向带权图的邻接矩阵表示法

    图 Java实现无向带权图的邻接矩阵表示法 1 图 1 1 图的介绍 图 Graph 是一种复杂的非线性表结构 图中的元素我们就叫做顶点 vertex 图中的一个顶点可以与任意其他顶点建立连接关系 我们把这种建立的关系叫做边 edge 跟顶
  • 4Sum

    Given an array S of n integers are there elements a b c and d in S such that a b c d target Find all unique quadruplets
  • 如何防止过拟合和欠拟合

    过拟合和欠拟合是模型训练过程中经常出现的问题 两种情况正好相反 现将两者的定义及如何防止进行简要总结 1 过拟合 1 1 定义 是指模型对于训练数据拟合呈现过当的情况 反映到评估指标上就是模型在训练集上的表现很好 但是在测试集上的表现较差
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • 区块链中的哈希算法

    区块链中的密码学 密码学在区块链中的应用主要有两个 哈希算法与非对称加密算法 这次主要对哈希算法进行详细的说明 哈希算法 哈希算法的特点有 1 输入可以为任意大小的字符串 2 产生固定大小的输出 3 可以在合理的时间内算出输出值 若要满足密
  • 雪糕的最大数量 排序+贪心

    雪糕的最大数量 雪糕的最大数量 题目描述 样例 数据范围 思路 代码 题目描述 夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 从源码角度来谈谈 HashMap

    HashMap的知识点可以说在面试中经常被问到 是Java中比较常见的一种数据结构 所以这一篇就通过源码来深入理解下HashMap 1 HashMap的底层是如何实现的 基于JDK8 1 1 HashMap的类结构和成员 HashMap继承

随机推荐

  • RTSP的WEB播放方案Streamedian

    因项目需要 xff0c 查找rtsp视频流web播放方法 xff0c 这是文档 原文文档连接 xff1a https streamedian com docs Streamedian是一个 Javascript 库 xff0c 它实现了 R
  • 解决UnsatisfiedLinkError: Unable to load library:Native library not found in resource path

    span class hljs keyword public span span class hljs class span class hljs keyword class span span class hljs title Test
  • TM4C123系列ARM单片机开发入门介绍

    初学TM4C123GH6PZ 以前未接触过ARM 所以感觉一头雾水 根据自己以前C51的简单经验 xff0c 对照资料很少的ARM4教程 摸索着终于明白了开发流程 xff0c 从软件到硬件用自己的程序点亮了LED 现将自己的学习过程记录下来
  • Kinect For Windows SDK 2.0的解读之《KinectV2开发手册》

    转载自 自己的博客 xff0c 由于百度迟迟没有收录 xff0c 在这里转发 Kinect For Windows SDK 2 0的解读之一 开发手册 这二天在外面出差 xff0c 回来才发现26号早晨微软已经通知我可以下载最新的SDK了
  • 使用QZXing识别图片二维码

    欢迎访问http brightguo com 试了下QZXing这个识别二维码库 xff0c 下载地址 xff1a 百度网盘 CSDN下载链接 本站下载连接 在github上下载qzxing xff08 https github com z
  • Ubuntu 16.04中用bazel交叉编译tensorflow lite

    首先在csdn上着了大神关于这个的实践如下链接 https www cnblogs com jojodru p 7744630 html 但是报错如下 xff0c 说是找不到opt选项 INFO Reading rc options for
  • 【原创】岁月如歌 一款网易歌单生成pdf的软件

    介绍 这是一款可以将网易云音乐的歌单中所有歌词输出为pdf的软件 项目持续维护地址 http brightguo com song list to pdf 目前没有搜到相关网易歌单导出为pdf的软件 xff0c 因此我特地将此软件开发出来免
  • 国内人脸识别公司哪家强,人脸比对跑个分比较下!

    前不久 最强大脑 第四季第一期的舞台上 xff0c 王峰对阵小度机器人进行了 人机大战 xff0c 其中最精彩和有趣的是第一场pk 从小时候照片判别长大后对应的人 xff0c 而她有个姐姐 xff0c 这对姐妹恰恰是双胞胎 xff01 百度
  • 2011年终总结

    2011年终总结 4月8日 xff0c 研究生面试 xff0c 和同学第一次来到上海 xff0c 当时的我又经受一次失败 xff0c 也许说我本该走这条路 也经常听到很多人说 xff0c 自己考得烂了 xff0c 最后到这个学校上学 从高中
  • 永久音乐外链

    使用skydrive上传速度变慢了 xff01 2013 2 14 文摘 xff1a http tieba baidu com p 1735575571 被删掉了 xff0c 2013 2 14 一直在申请吧主 xff0c 估计申请不上了
  • Apache2.2+MySql5.5+PHP5.4的安装和配置(windows)

    Apache2 2 43 MySql5 5 43 PHP5 4的安装和配置 phpMyAdmin的安装和配置 安装 Apache2 2 http httpd apache org download cgi apache24 Win32 Bi
  • 反思了一下过去几年的程序员之路

    最近回忆起一年前的找工作时的面试时的题目 xff0c 很多基础题都没做好 xff0c 很多概念也混淆不清 虽然自己这几年写的代码不少 xff0c 但都使用自己熟悉的东西写 xff0c 而已经有很多新的技术新的方法却没有使用过 一方面公司自己
  • 怎样使用OpenCV进行人脸识别 [停止更新]

    唯一持续维护地址 xff1a http guoming me face recognition with opencv 更新 2013 6 27 停止人脸识别的研究 xff0c 具体人脸识别系统可以参见文章 使用Kinect进行人脸识别 K
  • OpenCV矩阵运算

    一 矩阵 Mat I img I1 I2 dst A B double k alpha Scalar s 1 加法 I 61 I1 43 I2 等同add I1 I2 I add I1 I2 dst mask dtype scaleAdd
  • OpenCV官方学习文档[2013-7-4更新][最新版本2.4.6]

    最新的OpenCV2 4 6文档更新参见 xff1a http guoming me opencv OpenCV配置视频 OpenCV2 4 6 2013 7 3更新 http opencv org opencv 2 4 6 is out
  • ANSI与UNICODE字符函数对照表

    宽字符处理函数函数与普通函数对照表 字符分类 xff1a 宽字符函数普通 C 函数描述 iswalnum xff08 xff09 isalnum xff08 xff09 测试字符是否为数字或字母 iswalpha xff08 xff09 i
  • 做 LeetCode 有感

    今天周六 xff0c 公司一个人也没有 xff0c 下午花了5个半小时 xff0c 安安静静的再看 xff0c 再做了4道 LeetCode 的题目 看完之后 xff0c 现在仔细回想 xff0c 获得了什么 xff0c 好像什么也没有 但
  • 知识点滴 - 关于头文件的重复包含问题

    使用Include guard的目的 C Language Tutorial 61 gt Header Include Guards 2 12 Header guards Learn C 43 43 C C 43 43 中 xff0c in
  • 编程参考 - 编程中给变量起名时如何选择前缀,以及匈牙利命名法等

    我最开始当程序员用C语言写代码 xff0c 公司里推行编码规范 xff0c 变量的前缀都是有规定的 比如整型变量 xff0c 前面都是 u8Name i8Name u16Name i16Name之类的 尤其是嵌入式编程 xff0c 涉及到代
  • 【数据结构与算法 9】谁发明的八皇后,本宫赐你一丈红

    一 八皇后问题 八皇后问题 xff0c 一个古老而著名的问题 xff0c 是回溯算法的经典案例 该问题由国际西洋棋棋手马克斯 贝瑟尔于1848年提出 xff1a 在8 8格的国际象棋上摆放八个皇后 xff0c 使其不能互相攻击 xff0c