获得皇后区的每一个组合?

时间:2014-10-11 18:28:06

标签: java backtracking n-queens

public class SomeQueens {

static Stack<Integer> s= new Stack<Integer>();
static int Solved = 0;
static int current = 0;   


 public static int solve(int n) { // n is 8

   while(current < n) { // should I use current < n instead

     for (int i = current; i < n; i++) {
       if(validPosition(i)) {
            s.push(i);
            current = 0; 
      }
   }

   if(!validPosition(current)) {  
      if(s.empty()) {
           break;
      }
       if(!s.empty()) {
          s.pop();
          current++; 
}
}

 if(s.size() == n) {
      s.pop();
      current++; 
      printSolution(s);// this is a method, but it shouldn't matter for this
      Solved++;
  }
  }
    return Solved;
  }
 public static boolean validPosition(int column)  {
  for( int row = 0; row < s.size(); row++)
      if(s.get(row) == column || ((column - s.get(row)) == (s.size() - row)) || 
      ((s.get(row) - column) == (s.size() - row)) ) 
        return false; // there's a conflict
    return true; // no conflict;     
}

//it's called by int num = solve(n); 
//sop("There're" + num + "sols to the" + n "queens prob");  

这是我的NQueens程序的一个小节,但我似乎总是得到:8皇后问题有0个解决方案。我尝试使用main方法中的system.out.prints进行调试,这让我猜测我的布尔方法会出现问题,但我不认为它做错了什么。 我不确定我的while语句是否不正确,或者是否在完成任何操作之前初始化了while循环中的break。感谢您的帮助和指导,如果我的计划和解释毫无意义,我很抱歉

1 个答案:

答案 0 :(得分:1)

这就是你立刻得到零的原因:

s.push(0);
while(s.size() > n) // n is 8
{
 //...
}
return Solved;

当程序到达while-condition时,s的大小为1而n为8.这将立即失败并导致方法返回零。

但这不是算法的唯一问题。你应该认真地重新思考它。