我看到了下面的代码,并试图理解它是如何工作的。我陷入了回溯。有人能解释一下r值是如何从2变成1的。当它找不到适合女王放置的位置时。`下面是调试部分:
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函数:
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] = '-';
}
}
}下面是检查女王是否安全放置的函数:
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;
}发布于 2019-12-01 13:42:57
假设你已经放置了两个皇后,并准备放置第三个皇后。
nQueens()的递归调用。一个用于皇后0,另一个用于皇后3.nQueen(mat, r + 1);将通过nQueen(mat, 2)调用,第三个nQueens()将被推送到堆栈。考虑到将女王放置在第3行的N个位置中的任何一个是不安全的
对于所有列0,
if (isSafe(mat, r, i))将返回false。对于N.for (int i = 0; i < N; i++)将尝试重新定位第二个皇后。https://stackoverflow.com/questions/59122621
复制相似问题