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。感谢您的帮助和指导,如果我的计划和解释毫无意义,我很抱歉
答案 0 :(得分:1)
这就是你立刻得到零的原因:
s.push(0);
while(s.size() > n) // n is 8
{
//...
}
return Solved;
当程序到达while-condition时,s
的大小为1而n
为8.这将立即失败并导致方法返回零。
但这不是算法的唯一问题。你应该认真地重新思考它。