/*N皇后问题*/
#include<stdio.h>
#define FALSE 0
#define TRUE 1
#define N 8 //N为要放的皇后个数
int x[N + 1];
int flag;
void n_queen(int n);
void backtrack(int t);
int main()
{
n_queen(N);
getch();
}
void n_queen(int n)
{
/*
1.初始化数组x[i] = 0; //(x1, x2, … , xn)表示第i行的皇后放在x[i]列
2.flag = FALSE;
3.backtrack(1);
4.if(flag) 输出数组x
else 返回失败信息;
*/
int i;
for(i = 0; i <= N; i++)
x[i] = 0;
flag = FALSE;
backtrack(1);
if(!flag)
printf("FALL\n");
printf("Thanks for your evaluating!\n");
}
void backtrack(int t)
{
int i, j;
if(t > N)
{
for(i = 1; i <= N; i++){
for(j = 1; j <= N; j++)
if(x[i] == j)
printf(" Q");
else
printf(" X");
printf("\n");
}
printf("\n");
flag = TRUE;
}
else
for(i = 1; i <= N; i++){
x[t] = i;
if(Ok(x, t))
backtrack(t + 1);
}
}
int Ok(int x[], int t)
{
int i;
for(i = 1; i < t; i++)
if(abs(t - i) == abs(x[t] - x[i]) || x[t] == x[i])
return FALSE;
return TRUE;
}