C语言实现八皇后
时间: 2023-08-20 14:19:15 浏览: 193
八皇后问题是指在8×8的国际象棋棋盘上放置8个皇后,使得任意两个皇后都不能在同一行、同一列或同一条对角线上,问有多少种摆法。下面是C语言实现八皇后问题的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 8
int count=0; //记录符合条件的方案数
//输出解法
void print_solution(int chessboard[N][N]) {
int i, j;
printf("Solution %d:\n", count+1);
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (chessboard[i][j] == 1) {
printf("Q ");
} else {
printf(". ");
}
}
printf("\n");
}
printf("\n");
}
//判断该位置是否可以放置皇后
int is_valid(int chessboard[N][N], int row, int col) {
int i, j;
//判断同一列是否有皇后
for (i = 0; i < row; i++) {
if (chessboard[i][col] == 1) {
return 0;
}
}
//判断左上方是否有皇后
for (i = row-1,j = col-1; i >= 0 && j >= 0; i--,j--) {
if (chessboard[i][j] == 1) {
return 0;
}
}
//判断右上方是否有皇后
for (i = row-1,j = col+1; i >= 0 && j < N; i--,j++) {
if (chessboard[i][j] == 1) {
return 0;
}
}
return 1;
}
//递归求解八皇后问题
void eight_queens(int chessboard[N][N], int row) {
int i, j;
//已经放置了8个皇后,输出解法
if (row == N) {
print_solution(chessboard);
count++;
return;
}
//尝试在该行的每一个位置放置皇后
for (i = 0; i < N; i++) {
if (is_valid(chessboard, row, i)) {
chessboard[row][i] = 1;
eight_queens(chessboard, row+1);
chessboard[row][i] = 0;
}
}
}
int main() {
int chessboard[N][N] = {0}; //初始棋盘为空
eight_queens(chessboard, 0);
if (count == 0) {
printf("No solution found.\n");
} else {
printf("Total number of solutions: %d\n", count);
}
return 0;
}
```
代码思路:
1.定义一个8×8的数组作为棋盘,初始时所有元素都为0,表示没有皇后。
2.定义一个计数器count,用于统计符合条件的方案数。
3.定义一个函数is_valid,用于判断当前位置是否可以放置皇后。如果同一列、左上方或右上方已经有皇后,则无法再在该位置放置皇后。
4.定义一个函数print_solution,用于输出符合条件的解法。
5.定义一个递归函数eight_queens,用于求解八皇后问题。该函数的参数chessboard表示当前棋盘的状态,参数row表示当前正在尝试在第几行放置皇后。
6.递归求解的思路是从第0行开始,尝试在该行的每一个位置放置皇后,如果该位置可以放置皇后,则继续递归求解下一行。如果递归到第8行,说明已经成功放置了8个皇后,输出解法并增加计数器count。
7.最后在main函数中调用eight_queens函数求解八皇后问题,如果count为0表示没有符合条件的解法。
希望可以帮到您!
阅读全文