题目:http://acm.hdu.edu.cn/showproblem.php?pid=2553
dfs的题
1 #include<iostream> 2 #include<stdio.h> 3 #include<math.h> 4 #include<stdlib.h> 5 #include<string.h> 6 using namespace std; 7 const int N=20; 8 int n; 9 int count;//多少种排列组合 10 int a[N];//a[i]=j代表的是在i行j列 11 int visit[N];//用来排除列,例:a[1]=1;上有皇后,那么visit[a[1]]=1; 12 int check(int i,int j)//验证第i行j列 13 { 14 int k; 15 int flag=1; 16 for(k=1;k<i;k++) 17 { 18 if( abs(k-i) == abs(j-a[k]) )//检查是否在斜线相交 19 flag=0; 20 } 21 return flag; 22 } 23 24 void dfs(int i)//i代表行数 25 { 26 if(i>n) 27 count++; 28 else 29 { 30 int j; 31 for(j=1;j<=n;j++) 32 { 33 if(visit[j]==0 && check(i,j))//检查位置 34 { 35 a[i]=j; 36 visit[j]=1; 37 dfs(i+1); 38 visit[j]=0; 39 } 40 } 41 } 42 } 43 44 int main() 45 { 46 //freopen("in.txt","r",stdin); 47 int b[15]; 48 memset(b,0,sizeof(b)); 49 int i; 50 count=0; 51 for(i=1;i<=10;i++) 52 { 53 n=i; 54 memset(a,0,sizeof(a)); 55 memset(visit,0,sizeof(visit)); 56 dfs(1);//从第一行开始 57 b[i]=count; 58 //printf("%d ",b[i]); 59 count=0; 60 } 61 int m; 62 while(~scanf("%d",&m))//打表后输出,不然时超 63 { 64 if(m==0) 65 break; 66 printf("%d ",b[m]); 67 } 68 return 0; 69 }