八皇后问题

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

问题介绍

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 ≥ 1 或 n1 ≥ 4 时问题有解。
八皇后问题最早是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。之后陆续有数学家对其进行研究,其中包括高斯和康托,并且将其推广为更一般的n皇后摆放问题。八皇后问题的第一个解是在1850年由弗朗兹·诺克给出的。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。1874年,S.冈德尔提出了一个通过行列式来求解的方法,这个方法后来又被J.W.L.格莱舍加以改进。
艾兹格·迪杰斯特拉在1972年用这个问题为例来说明他所谓结构性编程的能力。
八皇后问题出现在1990年代初期的著名电子游戏第七访客中。

问题解决。

第一种:

也是最笨的方法,就是定义8个for循环。。。。

第二种:回溯算法

代码实现

public class Queen {private int[] column; //同栏是否有皇后,1表示有private int[] rup; //右上至左下是否有皇后private int[] lup; //左上至右下是否有皇后private int[] queen; //解答private int num; //解答编号public Queen() {column = new int[8+1];rup = new int[(2*8)+1];lup = new int[(2*8)+1];for (int i = 1; i <= 8; i++)column[i] = 0;for (int i = 1; i <= (2*8); i++)rup[i] = lup[i] = 0;  //初始定义全部无皇后queen = new int[8+1];}public void backtrack(int i) {if (i > 8) {showAnswer();} else {for (int j = 1; j <= 8; j++) {if ((column[j] == 0) && (rup[i+j] == 0) && (lup[i-j+8] == 0)) {//若无皇后queen[i] = j; //设定为占用column[j] = rup[i+j] = lup[i-j+8] = 1;backtrack(i+1);  //循环调用column[j] = rup[i+j] = lup[i-j+8] = 0;}}}}protected void showAnswer() {num++;System.out.println("\n解答" + num);for (int y = 1; y <= 8; y++) {for (int x = 1; x <= 8; x++) {if(queen[y]==x) {System.out.print("Q");} else {System.out.print(".");}}System.out.println();}}public static void main(String[] args) {Queen queen = new Queen();queen.backtrack(1);}
}

第三种:递归调用

代码实现

package p03.递归;/** 第1行*      1*      第2行*            3*          第3行*                5*              第4行*                    2   X*                  第5行*                        4   X*                      第6行*                            X*                      8   X*                      第6行*                            X*                  7*                  第5行*                        2   X*                      第6行 X*                          4   X*                          第7行*                                6   X*                              第8行*                                    X*                      4*                      ...*                        *                   8*              6*              7*              8*          4*          5*          6*          7*          8*      2*      3*      4*      5*      6*      7*      8* */
public class EightQueen {private static int count=0;   //记录第几种可能private static int N=8;public static void main(String[] args) {int[][] arr=new int[N][N];    //默认元素为0 1当皇后eightQueen(0,arr); //打印八皇后所有可能的解 并且从第一行开始 0}//row [0,7]private static void eightQueen(int row, int[][] arr) {if(row==N){//打印条件,假设是8皇后,每次走到第9行时就打印。count++;System.out.println("第"+count+"种:");for(int i=0;i<arr.length;i++){for(int j=0;j<arr[i].length;j++){System.out.print(arr[i][j]+" ");}System.out.println();}}else{//做一个数组备份int[][] newArr=new int[N][N];for(int i=0;i<arr.length;i++){for(int j=0;j<arr[i].length;j++){newArr[i][j]=arr[i][j];}}for(int col=0;col<N;col++){/*判断当前元素的上,左上,右上是否有皇后。*/if(noDangerous(row,col,newArr)){for(int c=0;c<N;c++){newArr[row][c]=0;//将当前行的其他位置的皇后置为0}newArr[row][col]=1;eightQueen(row+1, newArr);}}}    }private static boolean noDangerous(int row, int col, int[][] newArr) {//正上for(int r=row-1;r>=0;r--){if(newArr[r][col]==1){return false;}}//左上for(int r=row-1,c=col-1;r>=0&&c>=0;r--,c--){if(newArr[r][c]==1){return false;}}//右上for(int r=row-1,c=col+1;r>=0&&c<N;r--,c++){if(newArr[r][c]==1){return false;}}return true;}
}

执行结果

用递归思想和回溯算法解决八皇后问题(java实现)相关推荐

  1. 回溯算法解决八皇后_4皇后问题和使用回溯算法的解决方案

    回溯算法解决八皇后 4-皇后问题 (4 - Queen's problem) In 4- queens problem, we have 4 queens to be placed on a 4*4 ...

  2. 回溯算法解决八皇后问题(JAVA实现)

    送给程序猿们一句话 <拥有水滴石穿的坚持:懂得聚沙成塔的积累:磨练坚韧不拔的意志:学习脚踏实地的奋斗:提升立世做人的技巧:突破自我设限的障碍.> 文章目录 背景 问题解决 思路 什么是回溯 ...

  3. A*算法解决八数码问题 Java语言实现

    A*算法解决八数码问题 Java语言实现 参考文章: (1)A*算法解决八数码问题 Java语言实现 (2)https://www.cnblogs.com/beilin/p/5981483.html ...

  4. Python:各种算法解决八皇后问题

    文章目录 1 八皇后问题 2 解决方案 3 性能对比 4 总结 1 八皇后问题 问题:有一个8乘8的棋盘,现在要将八个皇后放到棋盘上,满足:对于每一个皇后,在自己所在的行.列.两个对角线都没有其他皇后 ...

  5. Java实现递归回溯,解决八皇后问题,数据结构与算法

    文章目录 八皇后问题 解决思路 代码实现 运行结果 八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆 ...

  6. 数据结构 - 递归 回溯算法(八皇后问题)

    游戏地址自己写完了可以根据结果去测试一下. 算法分析 八皇后问题算法思路分析 1)第一个皇后先放第一行第一列 2)第二个皇后放在第二行第一列.然后判断是否OK, 如果不OK,继续放在.第二列.第三列. ...

  7. 经典回溯算法(八皇后问题)详解

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...

  8. 数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)

    回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束. 与贪心算法不同的是,回溯算法理论上是可以得到最优解, ...

  9. 七十八、 回溯法解决八皇后问题

    @Author:Runsen 八皇后问题 八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后. 来自百度百科,皇后的走法是可 ...

最新文章

  1. R语言使用Repeat函数多次执行代码块内的语句,实现循环执行任务的功能:repeat没有提供任何检查条件,所以编码者必须给出退出重复循环的条件(一般使用if和break)
  2. MyEclipse6.0注册码算法代码,MyEclipse7.0注册码算法代码
  3. Qomolangma实现篇(四):基本特性增强与多投事件系统
  4. python 机器学习 爬取关键字_5行Python就能爬取 3000+ 上市公司的信息?
  5. ehcache + mysql例子与性能测试
  6. C语言向文件写入内容并读取显示
  7. 今天终于有自己的博客了!!!
  8. 使用eclipse新建一个SWT工程
  9. c语言一行灯的熄灯问题,熄灯问题
  10. lammps教程:nve/nvt/npt系综设置方法
  11. 网络应用 1.计算机网络应用体系结构 2.网络应用通信基本原理 3.域名系统(DNS)4.万维网应用 5.Internet电子邮件 6.FTP 7.P2P应用 8.Socket编程基础
  12. unity-shader-延迟渲染
  13. raspberry pi cm3+的i2c使用的问题调试
  14. 黑苹果 MacOS 10.15 Catalina安装教程
  15. wxh play 组织结构图
  16. uCLinux LINUX区别
  17. ZooKeeper命令行
  18. STL容器系列文章:array容器
  19. 编程实现古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  20. 用python抓取淘宝相关产品的价格及销量数据

热门文章

  1. 关于 IEEE PDF Checker无法嵌入字体等问题(Font ArialMT is not embedded) 已解决
  2. UWA助力小米VR打造内容生态
  3. groupadd r mysql_useradd 和groupadd
  4. linux 命令:groupadd 详解
  5. mysql高可用架构_mysql高可用架构详解
  6. 使用宝塔Linux面板搭建Springboot项目
  7. vue使用json数据
  8. 【C数据结构】迷宫问题
  9. 京东年货节,如何一键生成全店手机详情?
  10. STM32开发--- F429IG+3.5寸显示屏( ILI9486) +汉字驱动