//要求每一行、每一列和每一条斜线都只有1个皇后
#include<stdio.h>
#include<stdlib.h>
#define N 8
int count = 0;
int check_trialEx(int arr[][N], int n, int i, int j)//矩阵是否符合要求
{
int sum, m, k, iTmp, jTmp;
for (m=0; m<n; m++)//check列
{
sum = 0;
for(k=0; k<n; k++)
sum += arr[k][m];
if(sum>1)
return 1;
}
iTmp = i, jTmp = j;
while(i!=0 && j!=0)
{
if(arr[--i][--j])
return 1;
}
i = iTmp, j = jTmp;
while(i!=0 && j!=(n-1))
{
if(arr[--i][++j])
return 1;
}
return 0;
}
void print(int arr[][N], int n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
printf("\n");
count++;
}
void trial(int arr[][N], int i, int n)
{
if ( i>=n )
print(arr, n);//打印
else
{
for(int j=0; j<n; j++)
{
arr[i][j] = 1;
if( 1 == check_trialEx(arr, n, i, j) )
{
arr[i][j] = 0;
continue;//剪枝
}
else
{
trial(arr, i+1, n);
arr[i][j] = 0;
}
arr[i][j] = 0;//删除本轮修改
}
}
}
void main()
{
int arr[N][N] = {0};
trial(arr, 0, N);
printf("count = %d\n", count);
}