用非递归回溯法求解n的皇后问题
时间: 2024-02-27 16:56:10 浏览: 18
下面是使用非递归回溯法求解n皇后问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, i, j, count = 0;
scanf("%d", &n);
int *pos = (int *) malloc(n * sizeof(int)); // pos数组记录每行皇后的列号
for (i = 0; i < n; i++) {
pos[i] = -1; // 初始化pos数组为-1
}
i = 0;
while (i >= 0) {
if (pos[i] == n - 1) { // 如果该行皇后已经放置在最后一列,则回溯到上一行
pos[i--] = -1;
} else { // 否则,在下一列查找可以放置皇后的位置
j = pos[i] + 1;
while (j < n) {
int k;
for (k = 0; k < i && pos[k] != j && abs(i - k) != abs(j - pos[k]); k++);
if (k == i) { // 如果该位置不会与前面的皇后冲突,则放置皇后并进入下一行
pos[i] = j;
if (i == n - 1) { // 如果所有皇后都已放置,则输出一组解
printf("Solution %d:\n", ++count);
for (k = 0; k < n; k++) {
for (j = 0; j < n; j++) {
if (pos[k] == j) {
printf("Q ");
} else {
printf(". ");
}
}
printf("\n");
}
} else { // 否则,进入下一行
i++;
break;
}
}
j++;
}
if (j == n) { // 如果该行没有可以放置皇后的位置,则回溯到上一行
pos[i--] = -1;
}
}
}
free(pos);
return 0;
}
```
其中,数组`pos`记录每行皇后的列号,初始值为-1。从第一行开始,依次在下一列查找可以放置皇后的位置,如果该位置不会与前面的皇后冲突,则放置皇后并进入下一行;否则,在该行继续查找可行位置,直到找到一个可以放置皇后的位置或者该行没有可行位置。如果所有皇后都已放置,则输出一组解;否则,回溯到上一行,继续在下一列查找可行位置。