java中兔子问题流程图(java实现八皇后问题)

简介

八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。

问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题

java中兔子问题流程图(java实现八皇后问题)(1)

思路

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

    分享
    投诉
    首页