什么是八皇后问题?

八皇后问题是一个古老而著名的问题,它是回溯算法的典型案例。其问题的内容是:在8x8格的国际棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问共有多少种摆法。

八皇后问题算法思路分析:

1、先把第一个皇后放在第一行第一列;
2、第二个皇后放在第二行第一列,然后判断是否可行,如果可以,继续放在第二列、第三列,依次把所有列都放完,找到一个合适的;
3、继续放第三个皇后,还是从第一列、第二列…直到第八个皇后也能放在一个不冲突的位置上,这样就找到了一个正确的解;
4、当得到一个正确解时,在栈上回退到上一个栈,就会开始回溯,即将第一个皇后放在第一列的所有正确的解,都全部得到了;
5、然后继续第一个皇后放第二列,后面继续循环执行1、2、3、4的步骤

代码体现
public class EightQueens {//定义一个queens表示皇后的数量int queens = 8;//定义数组array,用于保存皇后位置摆放的结果:其中数组的下标表示排,数组下标对应的值表示列int[] array = new int[queens];static int count = 0;//用于记录最终存在多少种解法static int judgeCount = 0;//用于记录判断冲突的次数public static void main(String[] args) {new EightQueens().check(0);System.out.printf("一共有%d种解法\n", count);//一共有92种解法System.out.printf("判断冲突的次数共%d次", judgeCount);//判断冲突的次数共15720次}/*** 该方法用于放置第n个皇后** @param n 表示第n个皇后*/private void check(int n) {if (n == queens) { //此时n=8,也就代表8个皇后都已经放好了count++;print();return;}//依次放入皇后,判断是否发生冲突for (int i = 0; i < queens; i++) {//先把当前这个皇后放到该行的第一列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++) {//array[i] == array[n]:判断第n个皇后是否和前面的n-1个皇后在同一列//Math.abs(n - i) == Math.abs(array[n] - array[i]):判断第n个皇后是否和前面的n-1个皇后在同一对角线if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {return false;}}return true;}/*** 用于输出皇后摆放好之后的位置*/private void print() {for (int i = 0; i < array.length; i++) {System.out.print(array[i] + "\t");}System.out.println();}
}
注:

通过最终的结果看到了判断冲突的次数一共达到了1.5万余次,相对而言效率不够高,所以上诉代码后期还需要继续进行优化!

算法 | 八皇后问题相关推荐

  1. python深度优先算法 八皇后_八皇后问题——DFS(深度优先搜索)

    八皇后问题,是在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法? 算法思路: 八皇后问题实质为一种深度优先(DFS)搜索问题. ...

  2. 回溯算法(八皇后问题)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  3. 数据结构与算法-- 八皇后问题(多种实现方案)

    八皇后问题解法一(排列筛选法) 本篇我们承接上一篇中的思想,想到了一个经典的算法题,八皇后问题: 题目:在8*8的国际象棋上摆放8个皇后,使得其互相不能攻击,即任意两个换后不能在同一行,同一列,或者同 ...

  4. 分治回溯算法----八皇后问题

    八皇后问题:在一个8×8的棋盘中,放入8个皇后棋子,要求同行同列同斜线不能有重复的皇后棋子,八皇后问题一共有92种解法.如图所示:即八皇后问题的一个解. //分治回溯算法解决八皇后问题 public ...

  5. 学习笔记-回溯算法(八皇后问题)暴力法

    八皇后问题暴力解决法(介绍代码有说明) 先展示结果: 我这里用的是一维数组来展示的结果 array={7,3,0,2,5,1,6,4} 7的下标为0, 在这里下标+1表示的是第几个皇后也是行的位置,a ...

  6. Las Vegas算法八皇后问题最好的一种实现

    #include "pch.h" #include <iostream> #include <vector> #include <random> ...

  7. C++八皇后拼图,打印所有的算法(附完整源码)

    八皇后拼图,打印所有的算法 八皇后拼图,打印所有的算法的完整源码(定义,实现,main函数测试) 八皇后拼图,打印所有的算法的完整源码(定义,实现,main函数测试) #include <ios ...

  8. 一本通DFS经典:1214:八皇后

    1214:八皇后 一.数学模型 八皇后问题描述的是八个国际象棋中皇后棋子如何摆放的问题,而实际上可以抽象成8*8二维空间中的一种特殊选点问题:任意选择8个点,其中任意两个点:不同行不同列不同对角线: ...

  9. 八皇后算法python_Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  10. 算法与数据结构(Java解八皇后问题)

    八皇后问题 思路: 八个皇后互不冲突,即同一行同一列只能出现一位皇后.以行为标准,每一行只能放入一位皇后.可以使用一个一维数组来表示皇后的位置,一维数组的下表表示行数,一维数组中的元素表示列数. in ...

最新文章

  1. 如何实现报表设计中的高精度报表套打?
  2. 第四章 Joomla!扩展开发:前端开发
  3. iOS Sprite Kit教程之滚动场景
  4. 对于前端js框架对于事件处理的应用场景探讨
  5. 《HTML 5与CSS 3 权威指南(第3版·上册)》——1.2 HTML 5深受欢迎的理由
  6. wpf mvvm框架_[Windows] 在 Microsoft Docs 网站中挖掘 MVVM 的各种学习资源
  7. 【Henu ACM Round#19 A】 Vasya the Hipster
  8. WCF Error: 客户端配置部分中,找不到引用协定{0}的默认终结点元素……
  9. 西北工业大学生态环境学院张文宇课题组博士后招聘启事
  10. 背景图片自适应屏幕大小CSS写法
  11. 无损更换系统固态硬盘(系统盘克隆)
  12. 计算机中MAX函数是求什么,MAX函数
  13. QCC3040---uart configuration
  14. Springboot 整合 RabbitMQ「三种模式使用」
  15. 运维 技术支持 人在香港 硬件维护 经验
  16. 如何UNI-APP中使用iconfont彩色图标
  17. 李彦宏:为理想找到归宿
  18. 【Web_接口爬虫_Python3_58同城_requestosetreeproxies】58同城,商铺出租,爬取标题、内容、链接地址,保存文本_20200401
  19. Catalan 数之Python演示
  20. OnePiece 之 Asp.Net 菜鸟也来做开发(二)

热门文章

  1. 台式计算机如何自动开关机,电脑怎么设置自动关机时间 电脑自动开机时间怎么设置...
  2. 安装VMware出现无效驱动器
  3. 在网络世界中我们该如何保护我们的信息安全?
  4. 豆瓣上评分最高的9本必读书
  5. MATLAB 2016b--神经网络工具箱中BP网络的实现
  6. VML标记与通用属性
  7. 【深度分析】汽车零部件供应商管理+采购体系
  8. java里面获取map的key和value的方法
  9. java Map根据Value获取key
  10. 女生学计算机专业好吗_百度文库,没考上高中的女生学什么最好