八皇后是一个很经典的问题,通过回溯法可以很好解决,下面直接上代码。
#include "stdio.h"
#include "stdlib.h"
int a[9]={0};
int count=0; //计数器设置为全局变量
int Check(int n){ //判断此状态是否符合
int i;
for(i=1;i<n;i++)
if((abs(a[i]-a[n])==abs(i-n))||(a[i]==a[n]))//不符合
return 0;
return 1;
}
void Print(){
int j,k;
printf("坐标位置:");
for(j=1;j<=8;j++)
printf("(%d,%d) ",j,a[j]);
printf("\n");
for(k=1;k<=8;k++){//输出每一行情况
j=1;
while(j!=a[k]){
printf("0 ");
j++;
}
printf("1 ");
for(j++;j<=8;j++)
printf("0 ");
printf("\n");
}
}
void Queen(int i){
int k;
if(i>8) { //输出解
Print();
count++; //八皇后的解数目
return ;
}
else{
for(k=1;k<=8;k++){
a[i]=k;
if(Check(i)) //满足条件,回溯
Queen(i+1);
else
a[i]=0; //不满足,移走
}
}
}
//主函数入口
int main(){
Queen(1);
printf("解的个数为:%d\n",count);
return 0;
}