N皇后递归计划

时间:2016-04-03 09:02:46

标签: algorithm recursion dynamic

我正在尝试解决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!

非常感谢任何帮助!

1 个答案:

答案 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;