#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