#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<bits/stdc++.h>
int count;
int chess[100];
int num;
void queen(int n) {//遍历行数,也就是第几个皇后
if (n == num) {//当遍历完行数也要回溯,直到第一个皇后走完所有列
count++;
if (count == 1) {
printf("第一个解的结果:");
for(int i=0;i<num;i++)
printf("%d ", chess[i]);
}
}
for (int i = 0; i < num; i++) {//遍历列数,就是第n皇后在第i列,当遍历完列数都不安全就回溯上一个皇后
int safe = 1;
chess[n] = i + 1;//第n个皇后在第i列(因为i从0开始,加1让其更直观)
for (int j = 0; j < n; j++) {//检查上面皇后是否杀死当前皇后
if (chess[n] == chess[j] || chess[n] - chess[j] == n - j || chess[n] - chess[j] == j - n) {
safe = 0;
break;
}
}
if (safe) queen(n + 1); //如果合法就放下一个皇后
}
}
int main() {
printf("请输入皇后的个数,-1为终止\n");
while (scanf("%d", &num)&&num!=-1)
{
memset(chess, -1, sizeof(chess));//初始化棋盘,一个函数,你也可以自己用for初始化
count = 0;
queen(0);
printf("\n%d个皇后问题的全部解:%d", num, count);
printf("\n");
printf("\n");
}
return 0;
}
八皇后问题--回溯(迭代循环回溯)(只有代码和注释)
最新推荐文章于 2024-05-11 14:30:05 发布