n皇后问题c++递归
时间: 2023-11-03 14:22:08 浏览: 186
c++递归实现n皇后问题代码(八皇后问题)
n皇后问题是一个经典的递归问题。它要求在一个n×n的棋盘上放置n个皇后,使得它们互不攻击。在这个问题中,皇后可以横、竖、斜线方向移动任意步数而不受限制。
以下是一个使用递归解决n皇后问题的示例代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define N 8 // N表示棋盘大小
void printSolution(int board[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
printf(" %d ", board[i][j]);
printf("\n");
}
}
bool isSafe(int board[N][N], int row, int col) {
// 检查当前列是否有皇后
for (int i = 0; i < row; i++)
if (board[i][col])
return false;
// 检查左上方是否有皇后
for (int i = row, j = col; i >= 0 && j >= 0; i--, j--)
if (board[i][j])
return false;
// 检查右上方是否有皇后
for (int i = row, j = col; i >= 0 && j < N; i--, j++)
if (board[i][j])
return false;
return true;
}
bool solveNQueenUtil(int board[N][N], int row) {
if (row == N) {
printSolution(board);
return true;
}
bool res = false;
for (int col = 0; col < N; col++) {
if (isSafe(board, row, col)) {
board[row][col] = 1;
res = solveNQueenUtil(board, row + 1) || res;
board[row][col] = 0;
}
}
return res;
}
void solveNQueen() {
int board[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
board[i][j] = 0;
if (!solveNQueenUtil(board, 0))
printf("No solution exists");
}
int main() {
solveNQueen();
return 0;
}
```
这个代码使用了一个辅助函数 `solveNQueenUtil` 来递归地解决皇后问题。在 `solveNQueenUtil` 函数中,我们首先检查当前位置是否安全(不会受到其他皇后的攻击),如果是安全的,则将皇后放置在当前位置,并递归地解决下一行的皇后问题。如果找到了一个解决方案,则打印出棋盘,否则继续尝试下一个列位置。如果所有的列位置都尝试完毕仍然没有找到解决方案,那么就返回 false。
希望对你有所帮助!如果有任何疑问,请随时提问。
阅读全文