利用递归算法求解问题-八皇后问题 设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。 用C语言
时间: 2024-10-19 19:17:14 浏览: 37
回溯法-N皇后问题_N皇后回溯法C++_
八皇后问题是一个经典的回溯算法应用实例,用于寻找N×N chessboard上放置N个皇后,使得任意两个皇后都不在同一行、同一列,以及斜线上。下面是使用递归解决八皇后问题的一个基本思路:
```c
#include <stdio.h>
#define N 8
// 标记数组,表示每一行、每一对角线是否有皇后
int isSafe(int row, int col, int board[N][N]) {
// 检查列冲突
for (int i = 0; i < row; i++)
if (board[i][col] == 1)
return 0;
// 检查左上方对角线冲突
int di = row - col;
for (int i = 0; i < di; i++)
if (board[i][i + col] == 1)
return 0;
// 检查右上方对角线冲突
di = N - row - col;
for (int i = 0; i < di; i++)
if (board[i][N - i - col] == 1)
return 0;
return 1;
}
void printSolution(int board[N][N], int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j])
printf("%d ", j + 1);
else
printf(". ");
}
printf("\n");
}
printf("\n");
}
// 递归函数,尝试将皇后放在row位置
void solveNQueens(int row, int board[N][N], int n) {
// 如果达到最后一行,记录解决方案
if (row == n) {
printSolution(board, n);
return;
}
// 依次尝试每一列
for (int col = 0; col < n; col++) {
// 如果当前位置安全,则放置皇后
if (isSafe(row, col, board)) {
board[row][col] = 1;
// 继续在下一行尝试
solveNQueens(row + 1, board, n);
// 回溯到前一步,移除皇后
board[row][col] = 0;
}
}
}
int main() {
int board[N][N];
solveNQueens(0, board, N);
return 0;
}
```
这个程序首先初始化一个空的棋盘`board`,然后从第一行开始递归地尝试将皇后放在每一列,并检查是否违反规则。如果符合条件,就继续在下一行放置,直到所有皇后都被安置好。如果没有满足条件,就回溯到前一步并尝试其他位置。
阅读全文