首页 > 代码库 > Java与算法之(6) - 八皇后问题

Java与算法之(6) - 八皇后问题

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

技术分享

(文字和图片来自百度百科)

如果动手来摆放皇后,可以用这样一种思路:在最左侧一列放下一个皇后,然后在右边一列从上到下找到第一个与左边皇后不冲突的位置,摆放第二个皇后;再向yo一列,从上到下找到第一个与前两个皇后不冲突的位置摆放第三个皇后,依次类推,直到在最后一列摆下第八个皇后。

认真思考的话,可以发现这仍然是深度优先搜索的思路,即步步推进,下一步做的事情和当前是一样的。代码:

 

[java] view plain copy
 
 print?技术分享技术分享
  1. public class DfsEightQueens {  
  2.   
  3.     int[] queens = new int[8]; //记录每一列皇后的摆放位置  
  4.     int count = 0; //摆法总数  
  5.   
  6.     public void dfs(int column) {  
  7.         if(column == 8) { //8个皇后都已经摆放  
  8.             count++;  
  9.             System.out.println("第" + count + "种方法:");  
  10.             print();  
  11.             return;  
  12.         }  
  13.         for(int i = 0; i < 8; i++) {  
  14.             queens[column] = i; //在该列的第i行上放置皇后  
  15.             if(isValid(column)) //检查摆放在该位置是否与前column-1列的皇后有冲突  
  16.                 dfs(column + 1); //没有冲突则开始下一列8个位置的尝试  
  17.         }  
  18.     }  
  19.   
  20.     private boolean isValid(int column) {  
  21.         for(int i = 0; i < column; i++) { //第column列上的皇后与前面column-1个皇后比较  
  22.             if(queens[i] == queens[column]) //两个皇后在同一行上  
  23.                 return false;  
  24.             if(Math.abs(queens[i] - queens[column]) == (column - i)) //两个皇后在同一对角线上  
  25.                 return false;  
  26.         }  
  27.         return true;  
  28.     }  
  29.   
  30.     private void print() {  
  31.         for(int i = 0; i < 8; i++) {  
  32.             for(int j = 0; j < 8; j++) {  
  33.                 if(queens[i] == j)  
  34.                     System.out.print("* ");  
  35.                 else  
  36.                     System.out.print("_ ");  
  37.             }  
  38.             System.out.println();  
  39.         }  
  40.     }  
  41.   
  42.     public static void main(String[] args) {  
  43.         DfsEightQueens q = new DfsEightQueens();  
  44.         q.dfs(0);  
  45.         System.out.println("共" + q.count + "种摆放方法");  
  46.     }  
  47. }  
输出:

 

[java] view plain copy
 
 print?技术分享技术分享
  1. 92种摆放方法  
 
 

Java与算法之(6) - 八皇后问题