hdu 2553 N皇后问题

题目: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\n",b[m]);
67     }
68     return 0;
69 }

 

posted @ 2015-03-28 14:15  煎饼馃子  阅读(102)  评论(0编辑  收藏  举报