N种皇后的两种解法

来源:互联网 发布:网络虚假广告案例 编辑:程序博客网 时间:2024/04/28 20:22

第一种:

循环法

#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;
}


0 0
原创粉丝点击