HDU 2553 N皇后问题(DFS+打表)
数据小,DFS完,打表。1Y。直接搞会超时,预处理出来会AC。
造表代码
1 #include <stdio.h> 2 #include <string.h> 3 #define N 30 4 int k[12]; 5 int p[N][N],r[N],c[N],sr[N],sc[N]; 6 int z,n; 7 void dfs(int x,int y,int step) 8 { 9 int t,i,j; 10 if(step == n) 11 { 12 z ++; 13 return ; 14 } 15 if(x >= step + 2) 16 return ; 17 for(i = x; i <= n; i ++) 18 for(j = y; j <= n; j ++) 19 { 20 t = i-j+10; 21 if(!r[i]&&!c[j]&&!sr[i+j]&&!sc[t]) 22 { 23 r[i] = 1; 24 c[j] = 1; 25 sr[i+j] = 1; 26 sc[t] = 1; 27 dfs(i+1,1,step+1); 28 r[i] = 0; 29 c[j] = 0; 30 sr[i+j] = 0; 31 sc[t] = 0; 32 } 33 } 34 return ; 35 } 36 int main() 37 { 38 int i; 39 for(i = 1;i <= 10;i ++) 40 { 41 n = i; 42 memset(p,0,sizeof(p)); 43 memset(r,0,sizeof(r)); 44 memset(c,0,sizeof(c)); 45 memset(sr,0,sizeof(sr)); 46 memset(sc,0,sizeof(sc)); 47 if(!n) break; 48 z = 0; 49 dfs(1,1,0); 50 k[i] = z; 51 } 52 while(scanf("%d",&i)!=EOF) 53 { 54 if(!i) break; 55 printf("%d\n",k[i]); 56 } 57 return 0; 58 }
打表代码
1 #include <stdio.h>//打表 2 int main() 3 { 4 int p[12]={0,1,0,0,2,10,4,40,92,352,724}; 5 int a; 6 while(scanf("%d",&a)!=EOF) 7 { 8 if(!a) break; 9 printf("%d\n",p[a]); 10 } 11 return 0; 12 }

浙公网安备 33010602011771号