您的位置:首页 > 其它

hdu 2553 N皇后问题

2017-11-08 14:17 260 查看
题目: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
;//a[i]=j代表的是在i行j列
11 int visit
;//用来排除列,例: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 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: