zoukankan      html  css  js  c++  java
  • 【LeetCode】52.N-Queens II

    用的是回溯法

     1 class Solution {
     2 public:
     3     int INITIAL = -1000;
     4     // 一维数组a[n]中,下标代表行号,对应里面存的值代表列号。比如a[2] = 4,说明2行4列(0行0列为最开始的行列号)
     5     bool place(int *a, int n, int row, int col)    // 判断第row行第col列可否放置皇后
     6     {
     7         for (int i = 0; i < n; ++i)         // 逐行搜索有无冲突,i代表i行
     8         {
     9             if (a[i] == col || abs(i - row) == abs(a[i] - col))
    10                 return 0;
    11         }
    12         return 1;
    13     }
    14     
    15     int totalNQueens(int n) {
    16         int a[n];
    17         for (int i =0; i < n; ++i)      // 数组初始化
    18             a[i] = INITIAL;
    19         int row = 0, col = 0;
    20         int sum = 0;        // 有效的N皇后解
    21         
    22         while (row < n)
    23         {
    24             while (col < n)     // 对第row行的每一列进行探测,看能否放置皇后
    25             {
    26                 if (place(a, n, row, col))
    27                 {
    28                     a[row] = col;
    29                     col = 0;
    30                     break;      // 此处break表示第row行已经放置好皇后,可以进入到下一行进行搜索
    31                 }
    32                 else
    33                     ++col;
    34             }
    35             if (a[row] == INITIAL)      // 此时表示第row行没有找到可以放置皇后的位置
    36             {
    37                 if (row == 0)     // 回溯的终止条件
    38                     break;
    39                 else
    40                 {
    41                     --row;
    42                     col = a[row] + 1;       // 把上一行的皇后往后移一列(还需判断后移后是否满足条件)
    43                     a[row] = INITIAL;
    44                     continue;
    45                 }
    46             }
    47             if (row == n - 1)       // 程序能进入此判断内,则说明最后一行找到了皇后的位置,产生一个有效解
    48             {
    49                 ++sum;
    50                 col = a[row] + 1;   // 把这个有效解的位置清除掉,从最后一行、后移一列的位置继续探测
    51                 a[row] = INITIAL;
    52                 continue;
    53             }
    54             ++row;
    55         }
    56         return sum;
    57     }
    58 };

    中间犯了些小问题,这个题目最好在纸上把逻辑写下

    9 / 9 test cases passed.
    Status: 

    Accepted

    Runtime: 6 ms
    Submitted: 0 minutes ago
  • 相关阅读:
    关于const_cast
    TinyXPath与TinyXML
    C++的异常
    如何让对象只能处于堆中
    股票的委托价、成交价与成本价的关系
    static_cast dynamic_cast reinterpret_cast const_cast
    C++ MD5,SHA1源码下载和简单调用
    C++中char[]转string
    HttpWorker
    winnet winhttp
  • 原文地址:https://www.cnblogs.com/helloWaston/p/4491894.html
Copyright © 2011-2022 走看看