题目描述
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."],
["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
|
题解
依次指定第一行的第i个位置为Queen,做深度遍历,找出下一行与之前位置横竖斜线不在一个方向的位置,如果找到则继续,找不到则回滚。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| class Solution { public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> ret; if (n == 1) { ret.push_back(vector<string>{"Q"}); return ret; } if (n <= 3) { return ret; } for (auto col = 0; col < n; ++col) { auto row = vector<int>{col}; getQueenRow(n, ret, row); } return ret; } inline int getDiagL(int row, int col, int n = 0) { return row + col; } inline int getDiagR(int row, int col, int n) { return (n - 1 - row + col); } void getQueenRow(int n, vector<vector<string>>& list, vector<int>& rowList) { auto idx = (int)(rowList.size()); if (idx == n) { auto ret = convertBoard(rowList); list.push_back(ret); return; } auto targetRow = idx; for (auto targetCol = 0; targetCol < n; ++targetCol) { auto targetDiagL = getDiagL(targetRow, targetCol); auto targetDiagR = getDiagR(targetRow, targetCol, n); auto isValid = true; for (auto row = 0; row < targetRow; ++row) { if (row == targetRow) { isValid = false; break; } auto col = rowList[row]; if (col == targetCol) { isValid = false; break; } auto diagL = getDiagL(row, col); if (diagL == targetDiagL) { isValid = false; break; } auto diagR = getDiagR(row, col, n); if (diagR == targetDiagR) { isValid = false; break; } } if (isValid) { rowList.push_back(targetCol); getQueenRow(n, list, rowList); rowList.pop_back(); } } } vector<string> convertBoard(const vector<int>& rowList) { vector<string> ret; auto size = rowList.size(); for (auto i = 0; i < size; ++i) { string str; for (auto j = 0; j < size; ++j) { str += (j == rowList[i]) ? 'Q' : '.'; } ret.push_back(str); } return ret; }
};
|