题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
哎,不说了,打表过的,直接搜的话,TLE..
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 //#define MAXN 22 6 //int num[MAXN]; 7 //bool mark[3][MAXN]; 8 int sum,n; 9 10 /* 11 void dfs(int row){ 12 if(row==n+1)sum++; 13 for(int i=1;i<=n;i++){ 14 bool flag=true; 15 num[row]=i;//存当前行的列号 16 for(int j=1;j<row;j++){ 17 //判断列、主对角线、副对角线是否冲突 18 if(num[j]==num[row]||row-num[row]==j-num[j]||row+num[row]==j+num[j]){ 19 flag=false; 20 break; 21 } 22 } 23 if(flag)dfs(row+1);//此时,前row行都不冲突 24 } 25 } 26 */ 27 28 29 /* 30 void dfs(int row){ 31 if(row==n+1)sum++; 32 for(int i=1;i<=n;i++){ 33 if(!mark[0][i]&&!mark[1][row+i]&&!mark[2][row-i+n]){ 34 mark[0][i]=mark[1][row+i]=mark[2][row-i+n]=true; 35 dfs(row+1); 36 mark[0][i]=mark[1][row+i]=mark[2][row-i+n]=false; 37 } 38 } 39 } 40 */ 41 42 43 int main(){ 44 int ans[]={0,1,0,0,2,10,4,40,92,352,724}; 45 while(~scanf("%d",&n)&&n){ 46 // memset(num,0,sizeof(num)); 47 // memset(mark,false,sizeof(mark)); 48 // sum=0; 49 // dfs(1); 50 // printf("%d\n",sum); 51 printf("%d\n",ans[n]); 52 } 53 return 0; 54 } 55 56