递归算法求解八皇后问题
时间: 2023-11-10 11:06:26 浏览: 78
八皇后问题是经典的回溯算法例子,以下是递归算法的实现步骤:
1. 定义一个 8*8 的二维数组 chessBoard,表示棋盘。初始化全部为0,表示棋盘上所有位置都没有放置皇后。
2. 定义一个递归函数 putQueen(int row),表示在第 row 行放置皇后。递归终止条件为:当 row > 8 时,说明已经成功放置了8个皇后,打印输出棋盘上皇后的位置。
3. 在 putQueen 函数内部,遍历当前行中的每一个位置,然后判断该位置是否可以放置皇后。判断的方法是:遍历之前的每一行,判断该位置的同一列,同一对角线上是否已经存在皇后。如果不存在,就将该位置标记为皇后,并递归调用 putQueen(row+1),继续向下一行放置皇后。
4. 如果当前行的每一个位置都无法放置皇后,则回溯到上一行,撤销该行皇后的标记,重新尝试下一个位置。
以下是具体的代码实现(使用 C++ 编写):
```cpp
#include <iostream>
using namespace std;
const int N = 8;
int chessBoard[N][N];
void printChessBoard()
{
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
cout << chessBoard[i][j] << " ";
cout << endl;
}
}
bool check(int row, int col)
{
// 检查同一列是否有皇后
for(int i=0; i<row; i++)
if(chessBoard[i][col] == 1)
return false;
// 检查左上角至右下角对角线是否有皇后
for(int i=row-1, j=col-1; i>=0 && j>=0; i--, j--)
if(chessBoard[i][j] == 1)
return false;
// 检查右上角至左下角对角线是否有皇后
for(int i=row-1, j=col+1; i>=0 && j<N; i--, j++)
if(chessBoard[i][j] == 1)
return false;
return true;
}
void putQueen(int row)
{
if(row == N)
{
printChessBoard();
return;
}
for(int col=0; col<N; col++)
{
if(check(row, col))
{
chessBoard[row][col] = 1;
putQueen(row+1);
chessBoard[row][col] = 0;
}
}
}
int main()
{
putQueen(0);
return 0;
}
```
在上述代码中,check函数用于检查该位置是否可以放置皇后,putQueen函数用于递归放置皇后,printChessBoard函数用于打印输出棋盘上皇后的位置。
阅读全文