#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 30
int num;
int x[MAXNUM];
bool Place(int k)
{
int i;
i=1;
while(i<k)
{
if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k))
return false;
i=i+1;
}
return true;
}
void Print(int x[],int n)
{
//当前解得个数;
num++;
printf("第%d\t种解法:(",num);
for(int i=1;i<=n;i++)
{
//输出当前解;
printf("%d,",x[i]);
//每一个解输出完毕换行;
if(i%n==0)printf(");\n");
}
}
void NQueens(int n)
{
int k=1;
x[1]=0;
while(k>0)
{
// 向右移一列;
x[k]+=1;
//向右移至出最右列或可以放置皇后的列;
while(x[k]<=n&&!Place(k))
x[k]+=1;
if(x[k]<=n)
//向右移未移出棋盘;
{
//已移至最后一行;
if(k==n)
Print(x,n);
else
{
//向下移一行;
k=k+1;
x[k]=0;
}
}
//回溯至上一行;
else
k--;
}
}
void main()
{
int n;
char w;
printf("---^@^*** C Program aims at:n皇后问题***^@^---\n");
printf("_____By Wangxin 278810732@qq.com \n");
printf("^^^ Finish-time: 3/11/2011,16:00:00 ^^^\n");
WX:printf("请输入皇后个数N:");
scanf("%d",&n); //ctrl+break退出程序
num=0;
NQueens(n);
printf("%d 皇后有%d种解法!\t",n,num);
//清楚输入数据缓存;
fflush(stdin);
printf("是否继续 (Y/N)? :\t");
//获取输入字符;
w=getchar();
printf("\n");
//分之选择结构;
switch(w)
{
case 'Y':
case 'y':goto WX;break;
case 'N':
case 'n':break;
default: break;
}
}