概念介绍

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

  该问题是国际西洋棋棋手马克斯·贝瑟尔于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目录,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多算法!

  

02-13 13:24