zoukankan      html  css  js  c++  java
  • [LeetCode] N-Queens

    The idea is to use backtracking. In fact, the code below uses DFS, which involves backtracking in a recursive manner.

    The idea is also very simple. Starting from the first row, try each column. If it does not induce any attack, move on to the next row based on the configurations of the previous rows. Otherwise, backtrack to the current row and try another selection of the column position. Once we reach the last row, add the current setting to a vector<vector<string> >.

    The code below is referenced to this link, which records the positions of the queens using a nice 1d array like a[row] = col to indicate there is a queen at (row, col).

    The code is as follows.

     1 class Solution {
     2 public:
     3     vector<vector<string>> solveNQueens(int n) {
     4         vector<vector<string> > queens;
     5         vector<int> colPos(n, 0);
     6         solve(colPos, n, 0, queens);
     7         return queens;
     8     }
     9 private:
    10     bool noAttack(vector<int>& colPos, int row, int col) {
    11         for (int r = row - 1, ld = col - 1, rd = col + 1; r >= 0; r--, ld--, rd++)
    12             if (colPos[r] == col || colPos[r] == ld || colPos[r] == rd)
    13                 return false;
    14         return true;
    15     }
    16     vector<string> queenStr(vector<int>& colPos) {
    17         int n = colPos.size();
    18         vector<string> queen(n, string(n, '.'));
    19         for (int i = 0; i < n; i++)
    20             queen[i][colPos[i]] = 'Q';
    21         return queen;
    22     }
    23     void solve(vector<int>& colPos, int n, int row, vector<vector<string> >& queens) {
    24         if (row == n) {
    25             queens.push_back(queenStr(colPos));
    26             return;
    27         }
    28         for (int col = 0; col < n; col++) {
    29             colPos[row] = col;
    30             if (noAttack(colPos, row, col))
    31                 solve(colPos, n, row + 1, queens);
    32         }
    33     }
    34 };

    Well, if you have solved N-Queens II, you may know that problem has a nice bit-manipulation solution (you may refer to this passage). In fact, that bit-manipulation idea can also be used to solve this problem. The code is as follows.

     1 class Solution {
     2 public:
     3     vector<vector<string>> solveNQueens(int n) {
     4         vector<vector<string> > queens;
     5         vector<string> queen;
     6         int limit = (1 << n) - 1;
     7         solve(0, 0, 0, n, limit, queen, queens);
     8         return queens;
     9     }
    10 private:
    11     void solve(int hProj, int lProj, int rProj, int n, int limit, vector<string>& queen, vector<vector<string> >& queens) {
    12         if (hProj == limit) {
    13             queens.push_back(queen);
    14             return;
    15         }
    16         int pos = ~(hProj | lProj | rProj);
    17         for (int i = 0; i < n; i++) {
    18             int p = (1 << i);
    19             if (pos & p) {
    20                 string line(n ,'.');
    21                 line[i] = 'Q';
    22                 queen.push_back(line);
    23                 solve(hProj | p, (lProj | p) << 1, (rProj | p) >> 1, n, limit, queen, queens);
    24                 queen.pop_back();
    25             }
    26         }
    27     }
    28 };

     

  • 相关阅读:
    验证数字范围的小插件
    解决EJB懒加载问题
    JS获取按键的代码,Js如何屏蔽用户的按键,Js获取用户按键对应的ASII码(兼容所有浏览器)
    struts2标签之<s:select>
    c#(winform)中自定义ListItem类方便ComboBox和ListBox添加项完全解决
    辞职前须慎重考虑
    怎样把PDF文件在WinForm窗口中显示出来
    加载报表失败
    经典正则表达式 Javascript
    无法生成项目输出组“内容文件来自...
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4614567.html
Copyright © 2011-2022 走看看