版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caishu1995/article/details/85201460
#include "stdio.h"
#include "string.h"
int king(int n , int *left , int *right , int *down , int i , int *res)
{
int k; //底下一行无法放置皇后为1
int j;
for(j = 0 ; j < n ; j++)
{
if( ( down[j] == 0 ) && ( left[j+i] == 0 ) && ( right[i-j+n-1] ==0 ) )
{
down[j] = 1;
left[j+i] = 1;
right[i-j+n-1] =1;
if( i == n-1 )
{
*res = *res + 1 ;
down[j] = 0;
left[j+i] = 0;
right[i-j+n-1] =0;
continue;
}
k = king( n , left , right , down , i+1 , res );
if(k == 1)
{
down[j] = 0;
left[j+i] = 0;
right[i-j+n-1] =0;
continue;
}
}
}
if( j == n )
{
return 1;
}
return 0;
}
int main()
{
int n,i = 0,res = 0;
int left[20],right[20],down[10]; //用0,1来确定是否有皇后在同线
memset ( left , 0 , sizeof(left));
memset ( right , 0 , sizeof(right));
memset ( down , 0 , sizeof(down));
while( scanf("%d",&n) != EOF)
{
king( n , left , right , down , i , &res);
printf("%d\n",res);
res = 0;
}
return 0;
}