[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 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 };

 

 

目录
相关文章
|
机器学习/深度学习
LeetCode 51. N-Queens
n-queens难题是将n个皇后放置在n×n棋盘上的问题,使得没有两个皇后互相攻击。 给定整数n,返回n-queens拼图的所有不同解。
85 0
LeetCode 51. N-Queens
LeetCode - 51. N-Queens
51. N-Queens  Problem's Link  ---------------------------------------------------------------------------- Mean:  N-Queen问题.
869 0
LeetCode - 52. N-Queens II
52. N-Queens II  Problem's Link  ---------------------------------------------------------------------------- Mean:  略.
799 0
[LeetCode] N-Queens II
If you have solved the N-Queens problem, this one can be solved in a similar manner. Starting from the first row, we try each of its columns.
626 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行