java中兔子问题流程图(java实现八皇后问题)
八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题
思路
1.我们可以用一个大小为8的数组记录结果,数组的下标代表行、数组的值代表每一行中皇后的位置
2.每放一个皇后我们需要校验这个皇后和之前的皇后是否在同一行、同一列、同一斜线上
3.每一行都从第一个格子开始放皇后,依次匹配,直到匹配到成功的为止,然后再将第一行的皇后从第一个格子移到第二个格子,知道找到所有的放置皇后的方法
代码实现
package com.zyp.joseph;
/**
* 八皇后问题
* @author zyp
* @create 2022/1/19
*/
public class EightQueensProblem {
private final static int SIZE = 8;
/**
* 用于记录结果
* 数组的下标代表行
* 数组的值代表每一行的位置
*/
private static int[] array = new int[SIZE];
public static void main(String[] args){
//从第一行开始添加
addElements(0);
}
/**
* 放置元素
* @param n 代表放置第n个皇后
*/
public static void addElements(int n){
//代表已经放完了第8个元素
if(n == SIZE){
traverseArray();
return;
}
for(int i=0;i<SIZE;i ){
array[n] = i;
if(check(n)){
addElements(n 1);
}
}
}
/**
* 检查元素是否和之前的元素在同一行、同一列、同一斜线
* @param n 代表第n行元素
* @return
*/
public static boolean check(int n){
for(int i = 0;i<n;i ){
//代表在同一列或者是同一斜线上
if(array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i])){
return false;
}
}
return true;
}
/**
* 遍历数组
*/
public static void traverseArray(){
for(int i=0;i<array.length;i ){
System.out.print(array[i] "\t");
}
System.out.println();
}
}
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com