//皇后数 4 5 6 7 8 9 10 11 12 13 14
//独立解 1 2 1 6 12 46 92 341 1787 9233 45752
//全部解 2 10 4 40 92 352 724 2680 14200 73712 365596
#include <stdio.h>
#define N 8 //皇后个数
int a[N] = {0}; //a[i]代表i+1行第a[i]列
void print()
{//将每次的编排输出显示
static int icount = 0; //统计有多少种
int i = 0; //行
int j = 0; //列
icount++;
printf("%d******************************%d\n",icount,icount);
for(i=0; i<N; ++i)
{
for(j=0; j<N; ++j)
{
if(a[i] == j+1)
printf(" %c",'x'); //是皇后打印x
else
printf(" %c",'o'); //不是皇后打印o
}
printf("\n");
}
}
int check(const int i,const int j)
{//检查(i,j)位置是否可以放置
int m = 0;
int n = 0;
int flag = 0; //可放标志
//可放返回0,不可放返回1
//位置超出
if(i >= N || j>= N)
flag = 1;
for(m=0; 0==flag && m<i; ++m)
{//列
if(a[m] == j+1)
{
flag = 1;break;
}
}
for(m=i-1,n=j-1; 0==flag && m>=0 && n>=0; --m,--n)
{//左上
if(a[m] == n+1)
{
flag = 1;break;
}
}
for(m=i-1,n=j+1; 0==flag && m>=0 && n<N; --m,++n)
{//右上
if(a[m] == n+1)
{
flag = 1;break;
}
}
if(0 == flag)
{//若该位置可以放则存入
a[i] = j+1;
}
return flag;
}
int main()
{
int i = 0;
int j = 0;
int h_count = 0;
while(-1 != i)
{
if(0 == check(i,j))
{//等于0说明放置成功
i++; //下一行
j = 0; //从第一列开始
h_count++; //已放置的皇后+1
if(N == h_count)
{//若放满N个皇后则输出显示
print();
}
}
else
{//该位置不能放置
j++; //列后移一位
if(N <= j)
{//若列已超出最后位置
i--; //退到上层皇后
h_count--; //已放置皇后-1
j = a[i]; //皇后后移一列
}
}
}
return 0;
}