我正在尝试解决n-queen问题(将n个皇后放在nxn板上而没有任何两个皇后互相攻击)通过定义一个函数来获取一个nxn布尔数组的falses并且应该用true填充答案女王应该是。我得到了错误的答案,但不明白为什么递归不起作用!
bool check(bool ** board, int n, int row, int col){
if(row == 0) return true;
for(int r = 0 ; r < row ; ++r){
if(board[r][col]) return false;
int left = max(col - row + r, 0), right = min(col + row - r, n-1);
if(board[r][left] || board[r][right]) return false;
}
return true;
}
bool queen(bool ** board, int n, int level = 0 ){
for(int col = 0 ; col < n ; ++col){
if( !check(board, n, level, col) ) continue;
board[ level ][ col ] = true;
if( level == n-1 ) return true;
if( queen(board, n, level+1) ) return true;
board[ level ][ col ] = false;
}
return false;
}
在main()中我动态创建bool ** board,并用false填充它,然后调用queen(board,n)。
奇怪的是它提供了正确的解决方案,除了n = 4,6!
非常感谢任何帮助!
答案 0 :(得分:1)
您的错误是min / max.Operation,因此您不检查直线。 这应该可以解决问题:
int left = col - row + r;
int right = col + row - r;
if ( left >= 0 && board[r][left] || right < n && board[r][right])
return false;