2016-03-28 74 views
2

我正在努力尋找N皇后謎題的所有可能解決方案。我必須在每一行上打印單個皇后,並且沒有兩個皇后應該彼此相鄰,如同一列中沒有一個或多個皇后,同一列中沒有一個或多個皇后,同一列中沒有一個或多個皇后。無法找到N皇后謎題的可能解決方案

我寫了算法,認爲它的大部分是正確的,但解決方案沒有打印。我不明白爲什麼。我在這上面花了很多時間。

任何幫助將不勝感激。 以下是我的代碼:

public class NQueens { 

    int[] x; 

    public NQueens(int n) { 
     x = new int[n]; 
    } // CONSTRUCTOR 

    public void printQueens(int[] x) { 
     int N = x.length; 
     for (int i = 0; i < N; i++) { 
      for (int j = 0; j < N; j++) { 
       if (x[i] == j) { 
        System.out.print("Q "); 
       } else { 
        System.out.print("* "); 
       } 
      } 
      System.out.println(); 
     } 
     System.out.println(); 
    } 

    //Promising method 
    public boolean canPlaceQueen(int r, int c) { 

     for (int i = 0; i < r; i++) { 
      if (x[i] == c || (i - r) == (x[i] - c) ||(i - r) == (c - x[i])) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
    //permute method 
    public void placeNqueens(int r, int n) { 

     for (int c = 0; c < n; c++) { 
      if (canPlaceQueen(r, c)) { 
       x[r] = c; 
       if (validSol(r,n)) { 
        printQueens(x); 
       } else { 
        placeNqueens(r + 1, n); 
       } 
      } 
     } 
    } 

    public boolean validSol(int r, int n){ 
     if(r== n) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 

    public void callplaceNqueens() { 
     placeNqueens(0, x.length); 
    } 

    public static void main(String args[]) { 
     NQueens Q = new NQueens(8); 
     Q.callplaceNqueens(); 

    } 
} 
+0

無法打印?或者不能*查找*? – EJP

回答

2

您的代碼看起來不錯。它只在validSol方法中缺少一個關鍵檢查。 將validSold方法更改爲以下代碼並且您的代碼應該正常工作。

public boolean validSol(int r, int n){ 
     if(r== n-1) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 

讓我知道這是否適合你。

+1

感謝它的工作.. –

相關問題