zoukankan      html  css  js  c++  java
  • 八皇后问题

    概念介绍

      有同学想了解八皇后问题,今天它来了!先请百度百科,为我们介绍什么是八皇后问题?

      该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

      来一张高清无码大图,是不是看起来更直观了。

      

    代码实现

      思路分析:1.从第一行第一列开始放置皇后。

           2.从第二行第一列至第二行第八列开始放置不会相互冲突的皇后,直至放满八行。

           3.重复上述操作,毕竟第一行摆放皇后的位置就有八种。

      第一步:设置存放皇后位置的棋盘及相关变量。

    1     // 定义皇后的个数,这里取8
    2     int max = 8;
    3     // 用于存储皇后的位置,比如 result = {0 , 5, 7, 2, 6, 3, 1, 4}
    4     // 上述例子result表示,第一行的皇后在第1个位置,第二行的皇后在第6个位置,依次类推
    5     int[] result = new int[max];
    6     // 用来记录摆放皇后的解法的数量
    7     static int count = 0;

      第二步:实现判断是否会发生相互攻击的方法,这是核心点之一,判断是否会攻击的原则在注释中已经分析了。

     1    /**
     2      * Description:该方法用来判断皇后是否会相互攻击
     3      * @param n 表示第n个皇后,也就是第n行的皇后
     4      * @return
     5      */
     6     private boolean notAttackEachOther(int n) {
     7         // 说明:假设n=3.我们需要与第1层与第2层的皇后进行攻击判断
     8         // 判断是否会攻击的原则:
     9         //      1.同行:不会发生冲突,每次放置n都会+1,即第n层放置完毕后,就会去放置n+1层
    10         //      2.同列:假设第3层我们放到的是第3个位置,如果第1层与第3层皇后发生冲突
    11         //              那么有result[0] == result[2],所以同列冲突的条件是result[i] == result[n]
    12         //      3.同一斜线:假设第3层我们放到的是第3个位置,如果第1层与第3层皇后发生冲突
    13         //                  那么有result[0] = 0,result[2] = 2
    14         //                  所以同一斜线冲突的条件是Math.abs(n-i) == Math.abs(array[n] - array[i])
    15         for (int i = 0; i < n; i++) {
    16             if (result[i] == result[n] || Math.abs(n - i) == Math.abs(result[n] - result[i])) {
    17                 return false;
    18             }
    19         }
    20         return true;
    21     }

      第三步:实现放置皇后的代码。

     1     /**
     2      * Description:该方法用来放置皇后
     3      * @param n 表示第n个皇后,也就是第n行的皇后
     4      * @return
     5      */
     6     private void placeQueen(int n) {
     7         if(n == max) {
     8             showResult();
     9             return;
    10         }
    11         // 迭代从0-7,即每行都有8种可能性
    12         // 例如,第一行的皇后可以从第1列放置到第8列
    13         for(int i = 0; i < max; i++) {
    14             result[n] = i;
    15             // 当每放置一行的皇后,需要判断当前皇后是否会与之前的皇后们发生相互攻击的情况
    16             if(notAttackEachOther(n)) {
    17                 // 如果不会发生相互攻击的情况,那么继续放下一层皇后
    18                 placeQueen(n+1);
    19             }
    20         }
    21     }

      至此,代码编写完成,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具体实现位于algorithm工程下的queen目录,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多算法!

      

  • 相关阅读:
    PAT (Advanced Level) 1080. Graduate Admission (30)
    PAT (Advanced Level) 1079. Total Sales of Supply Chain (25)
    PAT (Advanced Level) 1078. Hashing (25)
    PAT (Advanced Level) 1077. Kuchiguse (20)
    PAT (Advanced Level) 1076. Forwards on Weibo (30)
    PAT (Advanced Level) 1075. PAT Judge (25)
    PAT (Advanced Level) 1074. Reversing Linked List (25)
    PAT (Advanced Level) 1073. Scientific Notation (20)
    PAT (Advanced Level) 1072. Gas Station (30)
    PAT (Advanced Level) 1071. Speech Patterns (25)
  • 原文地址:https://www.cnblogs.com/maguanyue/p/11579216.html
Copyright © 2011-2022 走看看