用C语言通过回溯法写N皇后问题的程序。
时间: 2024-02-25 09:57:31 浏览: 75
好的,下面是用C语言通过回溯法解决N皇后问题的程序:
```c
#include <stdio.h>
#include <stdlib.h>
int n; // 皇后数量
int cnt; // 解的数量
int *col; // col[i]表示第i行的皇后摆放在第col[i]列
int *flag; // flag[i]表示第i列是否已经摆放了皇后
void dfs(int row) {
if (row > n) { // 摆放完毕
cnt++;
printf("Solution %d:\n", cnt);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (col[i] == j) printf("Q ");
else printf(". ");
}
printf("\n");
}
printf("\n");
return;
}
for (int j = 1; j <= n; j++) {
if (!flag[j]) { // 第j列还没有皇后
int ok = 1;
for (int i = 1; i < row; i++) {
if (abs(row - i) == abs(j - col[i])) { // 对角线上有皇后
ok = 0;
break;
}
}
if (ok) { // 没有冲突
col[row] = j;
flag[j] = 1;
dfs(row + 1);
flag[j] = 0;
}
}
}
}
int main() {
printf("Please input the number of queens: ");
scanf("%d", &n);
col = (int *)malloc((n + 1) * sizeof(int));
flag = (int *)malloc((n + 1) * sizeof(int));
for (int i = 1; i <= n; i++) {
flag[i] = 0; // 初始化
}
dfs(1); // 从第1行开始搜索
printf("Total solutions: %d\n", cnt);
free(col);
free(flag);
return 0;
}
```
程序的运行结果会输出所有的解以及解的总数。
这个程序的基本思路是:从第1行开始,依次尝试在每一列放置一个皇后,如果放置后不会导致皇后之间发生冲突(即不在同一行、同一列或同一对角线上),则进入下一行继续尝试;如果不能放置,则回溯到上一行重新选择位置。
值得注意的是,在程序中使用了两个数组col和flag分别表示每一行的皇后所在的列和每一列是否已经有皇后。在每次回溯时,需要将当前行的col和flag数组恢复到之前的状态。
希望这个程序能够帮助你理解回溯算法的基本思想。
阅读全文