1. 程式人生 > >Java與算法之(6) - 八皇後問題

Java與算法之(6) - 八皇後問題

tools trac ava height com 技術分享 false fis light

在8×8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

技術分享

(文字和圖片來自百度百科)

如果動手來擺放皇後,可以用這樣一種思路:在最左側一列放下一個皇後,然後在右邊一列從上到下找到第一個與左邊皇後不沖突的位置,擺放第二個皇後;再向yo一列,從上到下找到第一個與前兩個皇後不沖突的位置擺放第三個皇後,依次類推,直到在最後一列擺下第八個皇後。

認真思考的話,可以發現這仍然是深度優先搜索的思路,即步步推進,下一步做的事情和當前是一樣的。代碼:

[java] view plain copy print?技術分享技術分享
  1. public class DfsEightQueens {
  2. int[] queens = new int[8]; //記錄每一列皇後的擺放位置
  3. int count = 0; //擺法總數
  4. public void dfs(int column) {
  5. if(column == 8) { //8個皇後都已經擺放
  6. count++;
  7. System.out.println("第" + count + "種方法:");
  8. print();
  9. return;
  10. }
  11. for(int i = 0; i < 8; i++) {
  12. queens[column] = i; //在該列的第i行上放置皇後
  13. if(isValid(column)) //檢查擺放在該位置是否與前column-1列的皇後有沖突
  14. dfs(column + 1); //沒有沖突則開始下一列8個位置的嘗試
  15. }
  16. }
  17. private boolean isValid(int column) {
  18. for(int i = 0; i < column; i++) { //第column列上的皇後與前面column-1個皇後比較
  19. if(queens[i] == queens[column]) //兩個皇後在同一行上
  20. return false;
  21. if(Math.abs(queens[i] - queens[column]) == (column - i)) //兩個皇後在同一對角線上
  22. return false;
  23. }
  24. return true;
  25. }
  26. private void print() {
  27. for(int i = 0; i < 8; i++) {
  28. for(int j = 0; j < 8; j++) {
  29. if(queens[i] == j)
  30. System.out.print("* ");
  31. else
  32. System.out.print("_ ");
  33. }
  34. System.out.println();
  35. }
  36. }
  37. public static void main(String[] args) {
  38. DfsEightQueens q = new DfsEightQueens();
  39. q.dfs(0);
  40. System.out.println("共" + q.count + "種擺放方法");
  41. }
  42. }
輸出:

[java] view plain copy print?技術分享技術分享
  1. 92種擺放方法

Java與算法之(6) - 八皇後問題