zoukankan      html  css  js  c++  java
  • Leetcode#51 N-Queens

    原题地址

    经典的8皇后问题变形版

    当然也是用经典的8皇后问题解法的变形版咯(仿照"位运算求解8皇后问题")

    row:当前是第几行

    col:皇后所在的列的情况

    left:左上角禁位(因为我是从下向上迭代的)

    right:右上角禁位(因为我是从下向上迭代的)

    代码:

     1 vector<vector<string> > result;
     2 vector<string> buffer;
     3 
     4 void solve(int row, vector<bool> &col, vector<bool> left, vector<bool> right) {
     5   if (row == 0) {
     6     result.push_back(buffer);
     7     return;
     8   }
     9 
    10   // 计算当前行可以放置皇后的位
    11   vector<bool> avail(col.size(), false);
    12   for (int i = 0; i < col.size(); i++)
    13     avail[i] = !(col[i] || left[i] || right[i]);
    14 
    15   // 计算上一行的左右禁位
    16   for (int i = 0; i < col.size() - 1; i++)
    17     left[i] = left[i + 1];
    18   left[col.size() - 1] = false;
    19   for (int i = col.size() - 1; i > 0; i--)
    20     right[i] = right[i - 1];
    21   right[0] = false;
    22 
    23   // 尝试、回溯
    24   for (int i = 0; i < col.size(); i++) {
    25     if (!avail[i])
    26       continue;
    27     col[i] = true;
    28     if (i > 0) left[i - 1] = true;
    29     if (i < col.size() - 1) right[i + 1] = true;
    30     buffer.push_back(string(i, '.') + "Q" + string(col.size() - i - 1, '.'));
    31     solve(row - 1, col, left, right);
    32     buffer.pop_back();
    33     if (i > 0) left[i - 1] = false;
    34     if (i < col.size() - 1) right[i + 1] = false;
    35     col[i] = false;
    36   }
    37 }
  • 相关阅读:
    LeetCode Subsets II
    LeetCode Rotate Image
    LeetCode Palidrome Number
    LeetCode Generate Parentheses
    LeetCode Maximum Subarray
    LeetCode Set Matrix Zeroes
    LeetCode Remove Nth Node From End of List
    Linux Loop设备 使用
    Linux 文件系统大小调整
    LeetCode N-Queens II
  • 原文地址:https://www.cnblogs.com/boring09/p/4245008.html
Copyright © 2011-2022 走看看