用C语言改写八皇后问题的C++程序
时间: 2024-09-24 17:08:19 浏览: 30
八皇后问题是一个经典的回溯算法问题,它要在8x8的棋盘上放置8个皇后,使得任意两个皇后都不在同一行、同一列或同一斜线上。下面是使用C语言实现的基本版本:
```c
#include <stdio.h>
#include <stdbool.h>
#define ROWS 8
#define COLS 8
bool isSafe(int row, int col, int** board) {
// 检查行是否冲突
for (int i = 0; i < row; i++) {
if (board[row][i] == col) {
return false;
}
}
// 检查左上方斜线是否冲突
int x = row - col + COLS - 1;
if (x >= 0 && board[x][col - 1] == col) {
return false;
}
// 检查右上方斜线是否冲突
x = row + col;
if (x < ROWS && board[x][COLS - 1 - col] == col) {
return false;
}
return true;
}
void solveNQueens(int row, int** board) {
if (row == ROWS) {
printSolution(board);
return;
}
// 尝试每一列
for (int col = 0; col < COLS; col++) {
if (isSafe(row, col, board)) {
board[row][col] = col; // 放置皇后
solveNQueens(row + 1, board); // 继续寻找下一行的解
board[row][col] = 0; // 回溯,如果当前列无法放置,则撤销
}
}
}
void printSolution(int** board) {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
int main() {
int board[ROWS][COLS] = {0};
solveNQueens(0, board);
return 0;
}
```
在这个程序中,`isSafe()` 函数检查当前位置是否安全,`solveNQueens()` 是递归函数,用于查找所有可能的解决方案,`printSolution()` 用于显示找到的解。`main()` 中初始化了二维数组并调用 `solveNQueens()`。
注意:此代码仅解决八皇后问题,未包含错误检查或优化,例如避免无效的内存访问。在实际使用时,需要添加适当的错误处理和边界检查。
阅读全文