#include<stdio.h>
#include<string.h>
#define max 10
int map[max][max];
int palce[max];
int ans[max];
/*
表示这一行的皇后放在哪一列
*/
int num;
int check(int t,int x,int n){
int i,j,k;
int flag=1;
for(i=0;i<x;i++){
if(map[t][i]==1){
flag=0;
return flag;
}
}
for(j=0;j<t;j++){
if(map[j][x]==1)
{
flag=0;
return flag;
}
}
for(k=0;(t-k>=0)&&(x-k)>=0;k++){
if(map[t-k][x-k]==1){
flag=0;
return flag;
}
}
/*
对角线有两边
*/
for(k=0;(t-k>=0)&&(x+k)<n;k++){
if(map[t-k][x+k]==1)
{
flag=0;
return flag;
}
}
return flag;
}
void dfs(int t,int n){
/*n表示总共有多少个皇后
*/
int tempx,tempy;
if(t==n){
num++;
/*
for(int i=0;i<n;i++){
printf("%d ",palce[i]);
}
printf("\n");
*/
return ;
}
for(int i=0;i<n;i++){
if(check(t,i,n)==1){
palce[t]=i;
map[t][i]=1;
dfs(t+1,n);
map[t][i]=0;
}
}
/*
这里应该是走不下去了
*/
return ;
}
int main(){
int n;
/*
n=5;
map[1][2]=1;
int a=check(2,1,n);
printf("%d\n",a);
*/
/*
这个题目会超时所以
先把所有的结果保存起来比较好
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
num=0;
memset(map,0,sizeof(map));
dfs(0,n);
printf("%d\n",num);
}
*/
for(int i=1;i<=10;i++){
num=0;
memset(map,0,sizeof(map));
dfs(0,i);
ans[i]=num;
}
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
printf("%d\n",ans[n]);
}
return 0;
}原文:http://blog.csdn.net/li_jun_09_05/article/details/23669511