用回溯法求n皇后问题。补充这段代码#include<stdio.h> #include<math.h> #include<string> //考察皇后k放置在x[k]列是否发生冲突 int Place(int k, int x[]) { } /* 求解n皇后问题 */ //递归算法 void Queens(int i, int x[],int n){ } int main() { int n; printf("请输入皇后个数:"); scanf("%d", &n); int *x = (int *)malloc(sizeof(int)*(n+1)); //递归调用 Queens(1, x, n); }
时间: 2023-06-20 16:09:38 浏览: 90
回溯算法求解n皇后问题
5星 · 资源好评率100%
下面是回溯法求解n皇后问题的完整代码:
```c++
#include<stdio.h>
#include<math.h>
#include<string.h>
/* 考察皇后k放置在x[k]列是否发生冲突 */
int Place(int k, int x[]) {
for (int i = 1; i < k; i++) {
if (x[i] == x[k] || abs(x[i] - x[k]) == abs(i - k)) {
return 0;
}
}
return 1;
}
/* 求解n皇后问题 */
void Queens(int i, int x[], int n) {
if (i > n) {
//输出解
for (int j = 1; j <= n; j++) {
printf("%d ", x[j]);
}
printf("\n");
return;
}
for (int j = 1; j <= n; j++) {
x[i] = j;
if (Place(i, x)) {
Queens(i + 1, x, n);
}
}
}
int main() {
int n;
printf("请输入皇后个数:");
scanf("%d", &n);
int *x = (int *)malloc(sizeof(int) * (n + 1));
memset(x, 0, sizeof(int) * (n + 1));
Queens(1, x, n);
return 0;
}
```
在这个程序中,`Place` 函数用于判断皇后 `k` 放置在 `x[k]` 列是否会与之前的皇后发生冲突,如果不会,返回 1;否则返回 0。`Queens` 函数用于递归求解皇后问题,参数 `i` 表示当前已经放置了 `i-1` 个皇后,`x` 数组存放了前 `i-1` 个皇后的位置信息,`n` 表示一共有 `n` 个皇后需要放置。在 `Queens` 函数中,我们依次尝试将第 `i` 个皇后放在第 `1` 列到第 `n` 列,如果放在第 `j` 列不会与之前的皇后发生冲突,那么就将皇后放在第 `j` 列,然后递归求解下一个皇后的位置。如果在递归中发现无法找到合适的位置放置皇后,那么就回溯到上一个皇后继续尝试其他位置。当 `i` 超过 `n` 时,说明已经成功放置了 `n` 个皇后,此时输出解。
阅读全文