首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回溯N皇后算法

回溯N皇后算法
EN

Stack Overflow用户
提问于 2019-12-01 12:54:04
回答 1查看 180关注 0票数 1

我看到了下面的代码,并试图理解它是如何工作的。我陷入了回溯。有人能解释一下r值是如何从2变成1的。当它找不到适合女王放置的位置时。`下面是调试部分:

代码语言:javascript
复制
nQueen (mat=0x7fffffffddb0, r=2) at N_Queens_problem.cpp:47
47      for (int i = 0; i < N; i++) 
(gdb) print i
$1 = 3
(gdb) n
62  }
(gdb) print i
No symbol "i" in current context.
(gdb) print i
No symbol "i" in current context.
**(gdb) print r
$2 = 2**
(gdb) n
nQueen (mat=0x7fffffffddb0, r=1) at N_Queens_problem.cpp:47
47      for (int i = 0; i < N; i++) 
**(gdb) print r
$3 = 1**
(gdb)

下面是nqueen函数:

代码语言:javascript
复制
void nQueen(char mat[][N], int r)
{
    // if N queens are placed successfully, print the solution
    if (r == N)
    {
        for (int i = 0; i < N; i++) 
        {
            for (int j = 0; j < N; j++)
                cout << mat[i][j] << " ";
            cout << endl;
        }
        cout << endl;

        return;
    }

    // place Queen at every square in current row r
    // and recur for each valid movement    
    for (int i = 0; i < N; i++) 
    {
        // if no two queens threaten each other
        if (isSafe(mat, r, i)) 
        {
            // place queen on current square
            mat[r][i] = 'Q';

            // recur for next row
            nQueen(mat, r + 1);

            // backtrack and remove queen from current square
            mat[r][i] = '-';
        }
    }
}

下面是检查女王是否安全放置的函数:

代码语言:javascript
复制
bool isSafe(char mat[][N], int r, int c)
{
    // return false if two queens share the same column
    for (int i = 0; i < r; i++)
        if (mat[i][c] == 'Q')
            return false;

    // return false if two queens share the same \ diagonal
    for (int i = r, j = c; i >= 0 && j >= 0; i--, j--)
        if (mat[i][j] == 'Q')
            return false;

    // return false if two queens share the same / diagonal
    for (int i = r, j = c; i >= 0 && j < N; i--, j++)
        if (mat[i][j] == 'Q')
            return false;

    return true;
}
EN

回答 1

Stack Overflow用户

发布于 2019-12-01 13:42:57

假设你已经放置了两个皇后,并准备放置第三个皇后。

  1. 到现在为止,堆栈中将有两个对nQueens()的递归调用。一个用于皇后0,另一个用于皇后3.
  2. nQueen(mat, r + 1);将通过nQueen(mat, 2)调用,第三个nQueens()将被推送到堆栈。

考虑到将女王放置在第3行的N个位置中的任何一个是不安全的

对于所有列0,

  1. if (isSafe(mat, r, i))将返回false。对于N.
  2. Ultimately,循环将结束,unwind.
  3. Stack将删除最上面的调用,我们将在堆栈中保留函数调用(bcak到步骤1)。
  4. 和循环for (int i = 0; i < N; i++)将尝试重新定位第二个皇后。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59122621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档