漫画:什么是八皇后问题

转载自 漫画:什么是八皇后问题?

题目是什么意思呢?


国际象棋中的皇后,可以横向、纵向、斜向移动。如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线、竖线、斜线方向上


让我们来举个栗子,下图的绿色格子是一个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:




下图的绿色格子是两个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:




那么,如何遵循规则,同时放置这8个皇后呢?让我们来看看小灰的回答。






———————————









什么是八皇后问题?


八皇后问题是一个古老的问题,于1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?


以高斯为代表的许多数学家先后研究过这个问题。后来,当计算机问世,通过计算机程序的运算可以轻松解出这个问题。







如何解决八皇后问题?


所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后......


如果某一层看遍了所有格子,都无法成功摆放,则回溯到上一个皇后,让上一个皇后右移一格,再进行递归。如果八个皇后都摆放完毕且符合规则,那么就得到了其中一种正确的解法。


说起来有些抽象,我们来看一看递归回溯的详细过程。


1.第一层递归,尝试在第一行摆放第一个皇后




2.第二层递归,尝试在第二行摆放第二个皇后(前两格被第一个皇后封锁,只能落在第三格):




3.第三层递归,尝试在第三行摆放第三个皇后(前四格被第一第二个皇后封锁,只能落在第五格):




4.第四层递归,尝试在第四行摆放第四个皇后(第一格被第二个皇后封锁,只能落在第二格):




5.第五层递归,尝试在第五行摆放第五个皇后(前三格被前面的皇后封锁,只能落在第四格):




6.由于所有格子都“绿了”,第六行已经没办法摆放皇后,于是进行回溯,重新摆放第五个皇后第八格。:




7.第六行仍然没有办法摆放皇后,第五行也已经尝试遍了,于是回溯到第四行,重新摆放第四个皇后第七格。:




8.继续摆放第五个皇后,以此类推......







八皇后问题的代码实现?


解决八皇后问题,可以分为两个层面:

1.找出第一种正确摆放方式,也就是深度优先遍历。

2.找出全部的正确摆放方式,也就是广度优先遍历。


由于篇幅优先,我们本篇只介绍如何找出第一种正确摆放方式。



在研究代码实现的时候,我们需要解决几个问题:


1.国际象棋的棋盘如何表示?

很简单,用一个长度是8的二维数组来表示即可。



由于这里使用的是int数组,int的初始值是0,代表没有落子。当有皇后放置的时候,对应的元素值改为1。


在这里,二维数组的第一个维度代表横坐标,第二个维度代表纵坐标,并且从0开始。比如chessBoard[3][4]代表的是棋盘第四行第五列格子的状态。



2.如何判断皇后的落点是否合规?

定义一个check方法,传入新皇后的落点,通过纵向和斜向是否存在其他皇后来判断是否合规。



3.如何进行递归回溯?

递归回溯是本算法的核心,代码逻辑有些复杂




4.如何输出结果?

这个问题很简单,直接遍历二维数组并输出就可以。



5.如何把这些方法串起来?

在main函数里分三步来调用:

第一步:初始化

第二步:递归摆放皇后

第三步:最后输出结果。


其中Queen8是整个类的名字。



最终输出如下:


10000000

00001000

00000001

00000100

00100000

00000010

01000000

00010000







几点补充:


1.由于篇幅原因,这一篇只讲了如何找出第一种正确的八皇后摆放。大家如果有兴趣,可以对文中的代码稍作改动,实现找出所有八皇后摆放的代码。


2.本漫画纯属娱乐,还请大家尽量珍惜当下的工作,切勿模仿小灰的行为哦。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis-java客户端jedis测试

【README】 本文旨在记录 jedis 包连接redis集群的开发方式&#xff0c;并对api做简单测试&#xff0c;api不会深入&#xff1b; maven引入的 jedis依赖 <dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</a…

MySQL优化(二):索引的类型、匹配原则、创建原则

目录索引的优缺点索引类型聚簇索引&#xff08;主键索引&#xff09;非聚簇索引&#xff08;二级索引、辅助索引&#xff09;索引匹配的原则最左匹配原则无法使用索引的场景索引创建的原则使不使用索引的依据到底是什么&#xff1f;参考索引的优缺点 常见的索引结构有: B 树&a…

jedis对redis键加锁+解锁+事务提交

【README】 redis的java客户端对键加锁和解锁&#xff08;Jedis.watch() Jedis.unwatch() &#xff09;&#xff1b; 【1】代码 /*** redis加锁-watch * 【场景描述】&#xff1a; watch命令就是标记一个键&#xff0c;如果标记了一个键&#xff0c;* 在提交事务前如果该键…

win10关闭快速启动_装系统不求人,快速制作启动U盘,傻瓜式重装WIN10

在以前如果我们的电脑系统损坏&#xff0c;无法进入WINDOWS系统&#xff0c;在需要重装WINDOWS系统时&#xff0c;一般的做法是&#xff0c;下载一个WINDOWS系统镜像&#xff0c;制作一个PE启动盘&#xff0c;在PE里安装系统镜像。这样传统的WINDOWS系统重装过程麻烦且耗时。而…

漫画:什么是SnowFlake算法

转载自 漫画&#xff1a;什么是SnowFlake算法方法一&#xff1a;UUIDUUID是通用唯一识别码 (Universally Unique Identifier)&#xff0c;在其他语言中也叫GUID&#xff0c;可以生成一个长度32位的全局唯一识别码。String uuid UUID.randomUUID().toString()结果示例&#xff…

FeignClient调用服务及上传文件的注意点及问题

目录代码示例文件服务接口调用方注意点&#xff1a;2021.3.16更新&#xff1a;发新的坑坑点&#xff1a;原因分析部分异常及解决方案异常一&#xff1a;[Method has too many Body parameters](https://blog.csdn.net/haishiyizhenfeng/article/details/80607003)异常二&#x…

redis主从复制部署策略+jedis设置主从

【README】 redis 有3种集群模式&#xff0c;包括 主从&#xff0c; 哨兵&#xff0c; cluster&#xff1b; 本文主要po出 主从&#xff1b; master 192.168.163.201 6382 slave 192.168.163.202:6382 【1】从机 202:6382 的 redis.conf 配置 只需要编写 slaveof 192.…

python绘图时的分解问题的步骤-零基础学python-15.2 分解函数

这一章节我们来说说函数的一些主要概念 我们以一小段代码为例&#xff1a; >>> def test(): pass >>> 1. def是可执行的代码 >>> test() >>> 我们调用test方法&#xff0c;尽管什么都没有&#xff0c;但是test已经执行了 2.def创建了一个对…

千万条数据,Stack Overflow是如何实现快速分页的

转载自 千万条数据&#xff0c;Stack Overflow是如何实现快速分页的 Stack Overflow 在分页机制中使用页码代替偏移量&#xff0c;页码指向基于 LIMIT 和 OFFSET 的查询。假设要对 1000 万条记录进行分页&#xff0c;跳到最后一页会非常慢&#xff0c;但 Stack Overflow 还是想…

ubuntu系统下安装docker并部署Springboot+mysql+redis

目录安装DockerDocker常用命令构建mysql容器构建Redis容器构建Springboot应用镜像及容器&#xff08;1&#xff09;springboot使用maven将程序打成jar包&#xff0c;接着编写Dokerfile文件&#xff0c;[Dockerfile详细介绍](http://www.dockerinfo.net/dockerfile%e4%bb%8b%e7%…

redis连接池

【README】 本文旨在po出 redis连接池的测试用例 <dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.5.1</version></dependency></dependencies> 【1】 代…

qmc0转换mp3工具_GoldenRecords for Mac(唱片录音转换软件)

想要将你最喜欢的唱片音乐转换成为方便易于携带的数字音频么&#xff1f;GoldenRecords Mac版是一款Macos上的唱片录音转换软件&#xff0c;用户可以将自己收藏的旧唱片快速转换成为自己喜欢的数字音频音乐&#xff0c;随时随地想听就听&#xff01;GoldenRecords mac版&#x…

java提高篇之抽象类与接口

转载自 java提高篇之抽象类与接口 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。 抽象类与接口是java语言中对抽象概念进行定义的两种机制&#xff0c;正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间对抽象概念的支持有很大的相似&…

Java中synchronized同步块的执行流程

必要知识 Java 对象的数据结构 在 HotSpot 虚拟机中&#xff0c;Java 对象在内存中存储的布局可以分为 3 块区域&#xff1a;对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Data&#xff09;和对齐填充&#xff08;Padding&#xff09;对象头中的 Mar…

深入理解Java的接口和抽象类

转载自 深入理解Java的接口和抽象类 对于面向对象编程来说&#xff0c;抽象是它的一大特征之一。在Java中&#xff0c;可以通过两种形式来体现OOP的抽象&#xff1a;接口和抽象类。这两者有太多相似的地方&#xff0c;又有太多不同的地方。很多人在初学的时候会以为它们可以随意…

转: 记录centos7 安装erlang22.3和rabbitMQ

转&#xff1a; https://blog.csdn.net/weixin_44436611/article/details/109492936 记录centos7 安装erlang22.3和rabbitMQ 记录centos7 安装erlang22.3和rabbitMQTOC 官网地址&#xff1a;https://www.rabbitmq.com/install-rpm.html#install-erlang 部分rpm包&#xff1a;…

hashmap应用场景_工作中常用到的Java集合有哪些?应用场景是什么?

秋招Java面试大纲&#xff1a;Java并发spring数据库RedisJVMNetty等疫情期间“闭关修炼”&#xff0c;吃透这本Java核心知识&#xff0c;跳槽面试不心慌Spring全家桶笔记&#xff1a;SpringSpring BootSpring CloudSpring MVC前言Java集合是我认为在Java基础中最最重要的知识点…

Zookeeper入门总结

什么是Zookeeper 官方定义&#xff1a; zookeeper是一个分布式服务框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;统一命名服务、状态同步服务、集群管理、分布式应用配置项的管…

rabbitmq启动失败-报Failed to load advanced configuration file解决方法

【README】 1、本文基于 centos8 搭建 rabbitmq&#xff1b; 版本信息如下&#xff1a; rabbitmq rabbitmq-server-3.8.12-1.el8.noarch.rpm erlang erlang 23.2.5 (erts-11.1.8) 上述两者版本一定要强对应&#xff0c;否则mq启动失败&#xff0c;参见官网 https://rabb…

Java抽象类与接口的区别

转载自 Java抽象类与接口的区别 抽象类 抽象类是用来捕捉子类的通用特性的 。它不能被实例化&#xff0c;只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。以JDK中的GenericServlet为例&#xff1a; public abstract class GenericServlet implements Servlet…