之前关于8皇后更详细总结:
算法设计 || 实验四 回溯算法-八皇后问题(纯手敲保姆级详细讲解+小白适用+头歌解析)_MSY~学习日记分享的博客-CSDN博客
学习的功夫一定要在平时,这样你考试前不必慌张,不用着急,
平时注意测试和复习,考试前非常轻松,
想要做自己喜欢的事情,人人都想要放松,
但是必须完成必须完成的事情,否则你不会安心的!
用回溯算法求解N=12皇后问题的- -个解。这里要求在试探前k
(k=你的学号后两位%3+3)个皇后的位置时不再是逐步-列列地
往后尝试,而是改做随机投放,剩下的N-k个皇后再逐个试探。编写求解该问题的C程序。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int *X; // 用于记录每个皇后所在的列数
int check(int k) {
int i;
for (i = 0; i < k; i++) {
// 如果当前位置同一列或同一对角线上已经有皇后,返回 0
if (X[k] == X[i] || abs(i - k) == abs(X[i] - X[k])) {
return 0;
}
}
return 1;
}
void setQueens(int N) {
// 前k个随机投放(check满足条件放)
int k = 5;
int i;
for (i = 1; i < k; i++) {
int num = rand() % N + 1; // 产生从1到N的随机数
X[i] = num;
while (!check(i)) {
X[i] = rand() % N + 1;
}
}
while (k > 0) {
X[k]++;
while (X[k] <= N && check(k)) {
if (k == N) {
return;
} else {
k++;
break;
}
}
// 出界,回溯
if (X[k] > N) {
X[k] = 0;
k--;
}
}
}
int main() {
int i;
int N = 12;
X = (int*)malloc(sizeof(int) * (N + 1));
for (i = 0; i <= N; i++)
X[i] = 0;
setQueens(N);
for (i = 1; i <= N; i++) {
printf("%d ", X[i]);
}
free(X);
return 0;
}