#include <stdio.h>
#include<math.h>
#include<malloc.h>
void nQueens(int *x,int n);//求解N皇后问题
int place(int *x,int k);//判断是否可以在第K行第x[k]列摆放皇后
void printSolution(int *x,int n);//输出求解结果
int main()
{
int n;
int *x;
scanf("%d",&n);
x=(int *)malloc(sizeof(int)*(n+1));
nQueens(x,n);
return 0;
}
//如果一个皇后能放在第k行第x[k]列,则返回真(1),否则返回假
int place(int *x,int k)
{
int i;
//对前k-1行,逐行考察
for(i=1;i<k;i++)
{
//如果前k-1行中有某行的皇后与第k行的在同一列或同一斜线,返回0
if(x[i]==x[k]||(fabs(x[i]-x[k])==fabs(i-k)))
return 0;
}
//能执行下一句,说明在第k行第x[k]列摆放皇后可行
return 1;
}
//求解在n*n的棋盘上,放置n个皇后,使其不能互相攻击
void nQueens(int *x,int n)
{
int k;
k=1; //k是当前行
x[k]=0;//定义当前列
while(k>0)
{
x[k]++;
while(x[k]<=n&&!place(x,k))
x[k]++;
if(x[k]<=n)//找到第一个位置摆放皇后
{
if(k==n)
printSolution(x,n);
else
{
k++;
x[k]=0;//到循环开始执行x[k]++后,下一行将从第一列开始考
}
}
else
k--;
}
}
//输出求解结果
void printSolution(int *x,int n)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j==x[i])
printf("Q");
else
printf("*");
}
printf("\n");
}
printf("\n");
}
