zoukankan      html  css  js  c++  java
  • dfs--八皇后问题

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

    因为我们要保证每个皇后不在同一个对角线,不在一行,不在一列

    所以我们每次把第k个皇后放在第k行,即保证每个皇后都不在同一行

    接下来我们要判断每个皇后是否在一列或者对角线即可

    我们设一个queen数组表示每个皇后所放位置所在列

    prey == ny || prey-prex == ny-nx || prey + prex == ny + nx

    如果以上条件都不成立,那么皇后k的放置就是合理的

     1 #include<iostream>
     2 #include<cstdio>
     3 int Queen[20],n;
     4 int dp[15];
     5 int dfs(int k)
     6 {
     7     if (k>n)
     8     return 1;
     9     int ans = 0;
    10     for (int i = 1 ;i<= n ;i++)
    11     {
    12     int nx = k, ny = i;//把第k个皇后放在第k行 
    13     bool isOk = true;
    14     for (int j = 1; j< k && isOk ;j++)
    15     {
    16     int prex = j, prey = Queen[j];//放过的皇后 
    17     if (prey == ny || prey-prex == ny-nx || prey + prex == ny + nx)//在同一列、一个对角线 不合法 
    18     isOk = false;
    19         }
    20          if (isOk)
    21         {
    22          Queen[k] = i;//k个皇后在k行i列 
    23          ans += dfs(k+1); 
    24         }
    25     }
    26     return ans;
    27 }
    28 int main()
    29  {
    30     while(scanf ("%d",&n)&&n!=0)
    31     {
    32         //缩短时间 
    33         if (dp[n]==0)
    34         dp[n]=dfs(1);
    35         printf ("%d
    ",dp[n]);
    36         }
    37     return 0;
    38 }
  • 相关阅读:
    Linq 入门系列 [Take,Skip,TakeWhile,SkipWhile]篇
    SqlString 引发的思考
    DLINQ
    Wrf 格式播放器
    仙剑奇侠传4序列号
    Asp.Net程序性能 浅谈
    Linq 扩展函数的应用
    正则表达式积累
    ajax 之取消服务器任务[转]
    Linq 演变的过程(delegate => Lamb => Linq)
  • 原文地址:https://www.cnblogs.com/very-beginning/p/11742164.html
Copyright © 2011-2022 走看看