可以直接复制运行
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define N 4
int q[N] ;
int check(int j){ //检查函数
int i;
for(i = 1; i < j ; i++){ //遍历该位置与之前所有位置,如果q[j] == q[i]即为在一列,不合规。abs(q[j] - q[i]) == abs(j - i) 表示斜率相同在同一斜线,不合规。
if(q[j] == q[i] || abs(q[j] - q[i]) == abs(j - i) ){
return 0;
}
}
return 1;
}
void queen1(){ //非递归方法
int i;
for(i = 1; i <= N; i++){ //初始化位置
q[i] = 0;
}
int anser = 0; //可能的方案数量
int j = 1;
while(j >= 1){ //第一个皇后进入,如果全都遍历完成,则j会回退到1,完结
q[j] = q[j] + 1;
while(q[j] <= N && !check(j)){ //判定如果第j个皇后在第j行位置没有溢出,并且位置不合法,则往后移动一位
q[j] = q[j] + 1;
}
if(q[j] <= N){ //皇后位置合法
if(j == N ){ //第N个皇后也有了合法位置
anser+=1;
printf("方案%d ",anser);
for(i = 1; i < N + 1; i++){ //循环输出值
printf("%d ",q[i]);
}
printf("\n");
q[j] = 0; //输出完成回退到第N-1行并清空第N个皇后的位置继续寻找
j = j - 1;
}
else{
j = j + 1; //如果还没到第四个皇后继续寻找
}
}
else{ //如果 q[j] > N 表面位置溢出,该行没有合法位置,清空该行的皇后位置并回退一行
q[j] = 0;
j = j - 1;
}
}
}
void queen2(int j ){ //递归方法
int i;
for(i = 1; i <= N;i++){
q[j] = i;
if(check(j)){
if(q[j] <= N){
if( j == N){ //找到一组解,并打印,用q[0]当计数器统计有多少个解
q[0]+=1;
printf("方案%d:",q[0]);
for (int k = 1; k < N + 1; k++){
printf("%d ",q[k]);
}
printf("\n");
}
else{
queen(j + 1); //递归调用queen()函数,如果符合check()函数就会一直执行,直到j == N,输出一组解,然后返回,深度遍历先把皇后1在第一列位置的后续所以都遍历完再到第二列位置以此类推
}
}
}
}
}
int main(){
queen1();
queen2(1);
return 0;
}