• 8皇后算法


    Java实现8皇后算法

     1 package com.java;
     2 
     3 /**
     4  * Created by dell on 2018-08-26.
     5  */
     6 public class nQueen {
     7 
     8     /**
     9      八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
    10      该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:
    11      在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
    12      问有多少种摆法。
    13 
    14      思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列。
    15      直到所有皇后都放完,或者放哪都不行。
    16 
    17      第一个皇后先放第一行第一列,然后第二个皇后放在第二行第一列、然后判断是否OK,然后第二列、第三列、依次把所有列都放完,
    18      找到一个合适,继续第三个皇后,还是第一列、第二列……
    19      直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解。
    20      然后回头继续第一个皇后放第二列,后面继续循环……
    21      */
    22 
    23     //一共有多少个皇后(此时设置为8皇后在8X8棋盘,可以修改此值来设置N皇后问题)
    24     static int max = 8;
    25 
    26     //该数组保存结果,第一个皇后摆在array[0]列,第二个摆在array[1]列
    27     static int[] result = new int[max];
    28 
    29     static int count=0;
    30 
    31     public static void main(String[] args) {
    32         //N皇后
    33         check(0);
    34         System.out.println("一共找到:" + count +"种解法");
    35     }
    36 
    37     /**
    38      * n代表当前是第几行的皇后
    39      * @param n
    40      * 皇后n在array[n]列
    41      */
    42     private static void check(int n) {
    43         /*终止条件是最后一个皇后已经摆完,由于每摆一步都会校验是否有冲突,所以只要最后一个摆完,说明已经得到了一个正确解*/
    44         //n表示行号
    45         if (n==max){
    46             //System.out.println(Arrays.toString(result));
    47             count++;
    48             System.out.println("找到一种解法如下(1-8代表8个皇后的摆放位置):");
    49             int[][] A = new int[max][max];
    50             for (int i = 0; i < result.length; i++) {
    51                 A[i][result[i]]=i+1;
    52             }
    53             for (int i = 0; i < A.length; i++) {
    54                 for (int j = 0; j < A[i].length; j++) {
    55                     System.out.print(A[i][j]+"	");
    56                 }
    57                 System.out.println();
    58             }
    59             return;
    60         }
    61         /*从每行的列开始放值,然后判断是否和本行本列本斜线有冲突,如果OK,就进入下一行的逻辑*/
    62         //i表示列的下标号
    63         for (int i=0;i<max;i++){
    64             result[n]=i;
    65             if (judge(n)){
    66                 check(n+1);
    67             }
    68         }
    69     }
    70     //判断是否和本行本列本斜线有冲突。有冲突返回false;无冲突返回true
    71     public static boolean judge(int n){
    72         for (int i=0;i<n;i++) {
    73             if (result[i]==result[n] || Math.abs(n-i)==Math.abs(result[n]-result[i])){
    74                 return false;
    75             }
    76         }
    77         return true;
    78     }
    79 
    80 }
  • 相关阅读:
    github用起来-pycharm中玩好github
    docker使用阿里云镜像报错
    林子大了什么鸟都有
    CentOS7部署docker
    虚拟机无法上网问题
    Centos7安装图形化界面
    分享一款非常棒的数据库文档生成工具,可导出md、excel等格式
    Java常见知识积累
    MySQL必知必会详细总结
    你真的会学习吗?从结构化思维说起
  • 原文地址:https://www.cnblogs.com/weijuanran/p/EightQueen.html
Copyright © 2020-2023  润新知