zoukankan      html  css  js  c++  java
  • 8皇后问题解答---海康威视研究院大数据技术部大数据算法工程师一面手撕

    八皇后问题英文Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
    问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题。
    以下是我的解法,程序最终运行结果告诉我们,一共有92种答案。

    public class Queue8 {
       int max =  8; // 定义一个max 表示共有多少个皇后
       int[] array =  new int[max]; // 定义数组array 保存皇后放置的结果,比如arr={0 4 7 5 2 6 1 3}
       static int count = 0;

       public static void main(String[] args ){
           Queue8 queue8 =  new Queue8();
           queue8.check(0);
           System.out.println("一共有" +count +"种解法 。");

      }

       private void check(int n ){
           if(n==max){
               print();
               return;
          }
           for(int i=0;i<max;i++ ){
               array[n] = i;
               if(judge(n)){
                   check(n+1);
              }
          }
      }

       private boolean judge(int n ){
           for(int i=0;i<n;i++){
               if(array[i] == array[n] || Math.abs( array[i]-array[n] ) ==  Math.abs(i-n) ){
                   return false;
              }
          }
           return true;
      }

       
       // 写一个方法,可以将皇后摆放的位置输出
       private void print(){
           count ++ ;
           for(int i=0;i<array.length;i++){
               System.out.print(array[i]+" ");
          }
           System.out.println();
      }
    }


  • 相关阅读:
    MySQL的四种事务隔离级别理解(new)
    深入分析ReentrantLock公平锁和非公平锁的区别 (转)
    Ubuntu 安装nginx
    Linux 文件的权限
    java Request 获得用户IP地址
    Maven profile 打包分环境加载不同的资源文件
    JQuery Ajax jsonp
    HttpClient 4.5.3 get和post请求https post
    Jenkins的安装配置
    javascript正则表达式
  • 原文地址:https://www.cnblogs.com/1832921tongjieducn/p/13308177.html
Copyright © 2011-2022 走看看