你能写个八皇后问题吗 用c语言
时间: 2023-12-13 15:03:38 浏览: 38
当然可以!以下是一个C语言实现的八皇后问题解法:
```c
#include <stdio.h>
#include <stdbool.h>
#define SIZE 8 // 棋盘的大小
int chessboard[SIZE]; // 记录棋盘上皇后的位置
int solutions = 0; // 解的数量
// 检查两个皇后是否会互相攻击
bool is_attacked(int row1, int col1, int row2, int col2) {
if (row1 == row2 || col1 == col2) {
return true;
}
if (row1 - row2 == col1 - col2 || row1 - row2 == col2 - col1) {
return true;
}
return false;
}
// 回溯求解八皇后问题
void solve(int row) {
if (row == SIZE) { // 如果所有行都放置了一个皇后,则找到一个解
solutions++;
printf("Solution %d:\n", solutions);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (chessboard[i] == j) {
printf("Q ");
} else {
printf(". ");
}
}
printf("\n");
}
printf("\n");
return;
}
for (int col = 0; col < SIZE; col++) { // 尝试在该行的每一列放置一个皇后
bool safe = true; // 是否安全的标志
for (int i = 0; i < row; i++) { // 检查前面已经放置的皇后是否会攻击到该位置
if (is_attacked(row, col, i, chessboard[i])) {
safe = false;
break;
}
}
if (safe) { // 如果安全,则放置该皇后并继续往下一行搜索
chessboard[row] = col;
solve(row + 1);
}
}
}
int main() {
solve(0); // 从第0行开始搜索解
printf("Found %d solutions.\n", solutions);
return 0;
}
```
这个程序会输出所有的解,并且计算出总共有几个解。