zoukankan      html  css  js  c++  java
  • 杭电 2553 N皇后问题 (dfs)

    Description

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

     

    Input

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

    Output

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

    Sample Input

    1
    8
    5
    0
     

    Sample Output

    1
    92
    10
     
    N行N列N个皇后,每行有一个皇后,先排第一行,找到合适的位置,用数组记录皇后在这一行的位置,标记整个列,其他的皇后都不能排在这一列,再判断是否有对角线不合适的情况。
     
     1 #include<cstdio>
     2 #include<string.h>
     3 int n,key[11],map[11],ans,sum[11];
     4 void dfs(int x)
     5 {
     6     int i,j,k;
     7     if(x == n+1)
     8     {
     9         ans++;
    10         return ;
    11         }
    12         
    13     for(i = 1 ; i <= n ; i++)
    14     {
    15         if(key[i] == 0)
    16         {
    17             k=1;
    18             map[x]=i;            //记录皇后在x行的i列。
    19             for(j = 1 ; j < x ; j++)
    20             {
    21                 if(map[x] == map[j]+(x-j) || map[x] == map[j]-(x-j))
    22                 {
    23                     k=0;
    24                     break;
    25                 }
    26             }
    27             if(k == 1)
    28             {
    29                 key[i]=1;            //标记整个列
    30                 dfs(x+1);
    31                 key[i]=0;            //清除标记,开始下一种情况
    32             }
    33         }
    34         
    35     }
    36 }
    37 int main()
    38 {
    39     for(n = 1 ; n <= 10 ;n++)
    40     {
    41         ans=0;
    42         memset(map,0,sizeof(map));
    43         memset(key,0,sizeof(key));
    44         dfs(1);
    45         sum[n]=ans;
    46     }
    47     while(scanf("%d",&n)&&n)
    48     {
    49         printf("%d
    ",sum[n]);
    50     }
    51 }
    ——将来的你会感谢现在努力的自己。
  • 相关阅读:
    后缀数组-另辟蹊径
    Project Euler 不定期更新
    Educational Codeforces Round 93 (Rated for Div. 2)
    Codeforces Round #664 (Div. 2)
    lower_bound和upper_bound的用法
    Codeforces Round #663 (Div. 2)
    Codeforces Round #661 (Div. 3)
    质数笔记
    C++运算符的优先级
    图的构建
  • 原文地址:https://www.cnblogs.com/yexiaozi/p/5717536.html
Copyright © 2011-2022 走看看