zoukankan      html  css  js  c++  java
  • 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 }
     
  • 相关阅读:
    python基础2
    python基础1
    25 CSS3盒子模型
    24 CSS3新增选择器
    23 html5新特性
    22 css初始化
    21 布局技巧
    20 溢出的文字显示省略号
    19 vertical-align 属性应用
    18 CSS三角 用户界面样式
  • 原文地址:https://www.cnblogs.com/ZKYAAA/p/12714908.html
Copyright © 2011-2022 走看看