N(8)皇后问题

来源:互联网 发布:网络端口号 编辑:程序博客网 时间:2024/06/04 07:03

N(8)皇后问题

  刚刚练下手,试了一下穷举法,据说还有回溯法,以后再尝试。先写我的穷举法解法
1.穷举法
/*N皇后问题   算法:穷举+N进制模拟*/#include<stdio.h>const maxn =1000; int a[maxn];                           //a[]:储存棋子位置,int  n,t[maxn],x1[2*maxn],x2[2*maxn];  //分别用来 判断是否列重合,'\' 和'/'两种斜是否重合;void clear(){                         //将判断用的数组清零for(int i=0;i<=2*n;i++) t[i]=0;for( i=0;i<=n*2;i++)x1[i]=0;for(  i=0;i<=n*2;i++)x2[i]=0;}                                int check(){//判断是否符合规则。for(int i=1;i<=n;i++){t[a[i]]++;if(t[a[i]]>=2){clear();return 1;}}for(i=1;i<=n;i++){x1[a[i]+n-i]++;   //如此之斜‘/';x2[i+a[i]-1]++;   //正斜 ‘\’;}for(i=0;i<2*n-1;i++)  if(x1[i]>=2||x2[i]>=2)  {  clear();  return 1;  }    return 0;}int main(){int z=1;scanf("%d",&n);int i=0;for(int j=1;j<=n;j++)           //此处模拟N进制,把皇后的位置以数字的形式保存。a[j]=j-1;while(a[0]!=1){                 //穷举法a[n]+=1;for(i=n;i>0;i--)if(a[i]>=n)a[i]-=n,a[i-1]+=1;      if(check())continue;for(i=1;i<=n;i++){for(j=0;j<a[i];j++)printf("0");printf("1");for(j=a[i]+1;j<n;j++)printf("0");printf("\n");}printf("--------------%d-------\n",z++);}return 0;}


原创粉丝点击