HDU2553 N皇后问题(dfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553


 

Problem Description

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。


 

Input

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。


 

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。


 

 Sample Input
1
8
5
0

Sample Output
1
92
10

 1 /*
 2  * @Descripttion: 
 3  * @version: 
 4  * @Author: ZKYAAA
 5  * @Date: 2020-04-16 17:56:05
 6  * @LastEditors: 请叫我ZK谕啊啊啊
 7  * @LastEditTime: 2020-04-16 18:44:34
 8  */
 9 #pragma GCC optimize(2)
10 #pragma GCC optimize(3)
11 #include <bits/stdc++.h>
12 using namespace std;
13 
14 //上次模拟赛,看了Alan聚聚的的题解,nice!抄了代码过来!!!!不会写那就模仿!
15 #define ll long long
16 #define ull unsigned long long
17 #define rint register int
18 #define rep(i, l, r) for (rint i = l; i <= r; i++)
19 #define per(i, l, r) for (rint i = l; i >= r; i--)
20 #define mset(s, _) memset(s, _, sizeof(s))
21 #define pb push_back
22 #define pii pair<int, int>
23 #define mp(a, b) make_pair(a, b)
24 
25 inline int read()
26 {
27     int x = 0, neg = 1;
28     char op = getchar();
29     while (!isdigit(op))
30     {
31         if (op == '-')
32             neg = -1;
33         op = getchar();
34     }
35     while (isdigit(op))
36     {
37         x = 10 * x + op - '0';
38         op = getchar();
39     }
40     return neg * x;
41 }
42 inline void print(int x)
43 {
44     if (x < 0)
45     {
46         putchar('-');
47         x = -x;
48     }
49     if (x >= 10)
50         print(x / 10);
51     putchar(x % 10 + '0');
52 }
53 
54 
55 int n,k=0;
56 int col[12]={0};
57 bool check(int c,int r){                          //检查是否与放好得皇后冲突
58     for(int i=0;i<r;i++){
59        if(col[i]==c||(abs(col[i]-c)==abs(i-r)))   //不同行,不同列,不同斜线           
60             return false;
61     }
62     return true;
63 }
64 void dfs(int r){                                  //一行一行得放皇后,第r行
65     if(r==n){                                     //所有的皇后都放置好了(递归返回)
66         k++;                                      //统计满足要求的数目
67         return ;
68     }
69     for(int c=0;c<n;c++){                         //在每一列放皇后
70         if(check(c,r)){                           //判断该位置是否合理
71             col[r]=c;                             //在第r行第c列放置皇后
72             dfs(r+1);                             //递归放下一行皇后
73         }
74     }
75 }
76 
77 int main(){
78     int sum[12]={0};
79     for(n=0;n<=10;n++){                           //求出所有N皇后的总数,先打表,不然会TLE
80         memset(col,0,sizeof(col));                //清空,准备计算下一个N皇后
81         k=0;
82         dfs(0);
83         sum[n]=k;                                 //打表
84     }
85     while(cin>>n){
86         if(n==0)
87             return 0;
88         cout<<sum[n]<<endl;
89     }
90     return 0;
91 }

 

 

posted on 2020-04-16 18:45  恒晨  阅读(162)  评论(0编辑  收藏  举报

导航