概念介绍
有同学想了解八皇后问题,今天它来了!先请百度百科,为我们介绍什么是八皇后问题?
该问题是国际西洋棋棋手马克斯·贝瑟尔于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目录,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多算法!