用c语言编程实现基于回溯法的八皇后问题 输入: 8 输出: 92
时间: 2024-03-05 20:52:21 浏览: 70
C语言图的着色问题回溯法
好的,我来为您解答这个问题。
首先,让我们来了解一下八皇后问题:
八皇后问题指的是在一个 8x8 的棋盘上放置八个皇后,使得每个皇后都无法攻击到其他皇后,即每个皇后所在的行、列、对角线上都不能有其他皇后。
使用回溯法可以解决八皇后问题。具体思路是从第一行开始,依次尝试将皇后放置在每一个格子上,然后检查是否合法。如果合法,则继续放下一行的皇后;如果不合法,则回溯到上一行,重新尝试放置皇后。
以下是用 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 8
int count = 0; // 解的个数
void print(int *a) // 输出一组解
{
int i, j;
printf("Solution %d:\n", ++count);
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
if (a[i] == j) {
printf("Q ");
} else {
printf(". ");
}
}
printf("\n");
}
printf("\n");
}
int check(int *a, int n) // 检查当前的解是否合法
{
int i;
for (i = 1; i < n; i++) {
if (a[i] == a[n] || abs(a[i] - a[n]) == abs(i - n)) {
return 0;
}
}
return 1;
}
void queen(int *a, int n) // 放置第 n 行的皇后
{
int i;
if (n > N) { // 如果已经放置了 N 个皇后,输出一组解
print(a);
return;
}
for (i = 1; i <= N; i++) { // 尝试将皇后放置在每一个格子上
a[n] = i;
if (check(a, n)) { // 如果当前解合法,继续放下一行的皇后
queen(a, n + 1);
}
}
}
int main()
{
int a[N + 1] = {0}; // a[i] 表示第 i 行的皇后放在第 a[i] 列
queen(a, 1); // 从第一行开始放置皇后
printf("Total number of solutions: %d\n", count);
return 0;
}
```
输入 8 后,输出的解的个数是 92,与题目要求一致。
阅读全文