algorithm - N皇后递归程序

标签 algorithm recursion dynamic

我试图通过定义一个函数来解决 n-queen 问题(将 n 个皇后放在 nxn 板上,没有任何两个皇后互相攻击)皇后应该是。我得到的答案不正确,但不明白为什么递归不起作用!

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!

非常感谢任何帮助!

最佳答案

你的错是最小/最大操作,所以你没有检查直线。 这应该可以解决问题:

int left = col - row + r;
int right = col + row - r;

    if ( left >= 0 && board[r][left] || right < n && board[r][right])
            return false;

关于algorithm - N皇后递归程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36383506/

相关文章:

搜索最高峰点的算法

c++ - C++14中递归调用泛型lambda表达式的类型

c++ - 动态绑定(bind)shared_ptr

javascript - 具有动态高度的动态 iframe

algorithm - 具有动态项目优先级的优先级队列

algorithm - 页面替换算法

python - 递归查找列表中的最小值

ruby - 定义带有多个参数的递归方法

Java - 与原始数据类型的动态比较

algorithm - 克鲁斯卡尔算法如何贪婪?