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