2016-03-28 49 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

感谢它的工作.. –

相关问题