第一种:
循环法
#include<stdio.h>
#define N 9
int count=0;//表示是几种可能
int a[N]={-1};//表示地i行a[i]列是放了皇后的
void printHuhou(){
int i,j;
for(i=0;i<N;i++)
{
printf("\n");
for(j=0;j<N;j++)
{
if(j==a[i])
printf("H ");
else printf("0 ");
}
}
printf("\n");
}
int isOk(int x,int y){//检查是否位置符合标准
int i,j;
for( i=0;i<x;i++)
{j=a[i];
if(j==y||x-y==i-j||x+y==i+j)
return 0;}
return 1;//如何i=0;则直接return 1;
}
void check(int i){
while(i>=0){
a[i]++;
while( a[i]<N&&!isOk(i,a[i]))
a[i]++;//符合条件
if(a[i]<N)//z在N-1列数内就判断
{ if(i==N-1)//最后一行就计数
{count++;
printf("第%d种答案",count);
printHuhou();
}
else
a[++i]=-1;
}
else {
i--;
}
}
}
int main(){
int a,b;
a=time(0);
check(0);
b=time(0);
printf("共有%d种答案",count);
printf("工花了 %d秒",b-a);
return 0;
}
第二种:递归法
#include<stdio.h>
#define N 6//任意改就可以是N皇后了
int count=0;//表示是几种可能
int a[N]={0};//表示地i行a[i]列是放了皇后的
void printHuhou(){
int i,j;
for(i=0;i<N;i++)
{
printf("\n");
for(j=0;j<N;j++)
{
if(j==a[i])
printf("H ");
else printf("0 ");
}
}
printf("\n");
}
int isOk(int x,int y){//检查是否位置符合标准
int i,j;
for( i=0;i<x;i++)
{j=a[i];
if(i==x||j==y)
return 0;
else if(x-y==i-j||x+y==i+j)
return 0;}
return 1;//如何i=0;则直接return 1;
}
void check(int i){
if(i==N)
{puts("布局查看");
printHuhou();
count++;
}//打印出皇后
else{
int l;
for( l=0;l<N;l++){
if(isOk(i,l)){
a[i]=l;
check(i+1);
a[i]=0;//遍历到底了或者失败了就回来进行下一列遍历
}
}
}
return;
}
int main(){
check(0);
printf("共有%d种答案",count);
return 0;
}