N皇后递归程序

Posted

技术标签:

【中文标题】N皇后递归程序【英文标题】:N Queen recursive program 【发布时间】:2016-04-03 09:02:46 【问题描述】:

我正在尝试通过定义一个函数来解决 n-queen 问题(将 n 个皇后放在 nxn 板上,而没有任何两个皇后相互攻击),该函数采用 nxn 布尔数组的 false 并且应该用 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】:

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

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

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

【讨论】:

感谢这确实有效!但我不明白 min max 有什么问题,因为他们只确保我不会离开董事会的边界并做与你的条件语句相同的工作 当你到达棋盘边缘时,你会沿着柱子跑:从 [1,3] 开始,你检查 [0,2],然后是 [0,1] 和 [0,0 ]。这就是我不检查直线的意思...

以上是关于N皇后递归程序的主要内容,如果未能解决你的问题,请参考以下文章

HDU2553 N皇后问题

程序设计与算法算法基础》《第二周 递归》N皇后问题

N皇后问题(递归)

n皇后问题中的回溯和递归(Python)

N皇后问题(递归回溯)

八皇后问题求解的C语言程序的实现