力扣 题目51--N 皇后/52--N皇后 II
题目
题解
翻译一下即对角线 行 列不能出现多个棋子 有点像数组
那么应该用一个其他容器记录 当一个棋子被放入时 导致了哪些位置不能放入
1 vector<vector<int>>Standing(n, vector<int>(n, 0)); 2 for (int j = 1; j < Standing.size(); j++) { 3 //列 4 if (row + j < Standing.size()) { 5 Standing[row + j][i] += 1; 6 } 7 //右对角线 8 if (row + j < Standing.size() && i + j < Standing.size()) { 9 Standing[row + j][i + j] += 1; 10 } 11 //左对角线 12 if (row + j < Standing.size() && i - j > -1) { 13 Standing[row + j][i - j] += 1; 14 } 15 }
也就是说当一个棋子被放入后他所在位置的列 右对角线 左对角线都进行+1操作 使用+1的好处是当某一个位置被重复标记时 回溯-1时不会把该位置 设置为可以放置 (为0时可以放置)
(由于我们是以行向下遍历所有 所以这里不用关心棋子位置之前的行数)
递归
1 ressolveNQueens(n, replace, result, Standing, row + 1);
回溯
1 replace[row][i] = '.'; 2 Standing[row][i] -= 1; 3 for (int j = 1; j < Standing.size(); j++) { 4 if (row + j < Standing.size()) { 5 Standing[row + j][i] -= 1; 6 } 7 if (row + j < Standing.size() && i + j < Standing.size()) { 8 Standing[row + j][i + j] -= 1; 9 } 10 if (row + j < Standing.size() && i - j > -1) { 11 Standing[row + j][i - j] -= 1; 12 } 13 }
ps:复杂度好像有点高 只打败了%10 但是看了一下思路都差不多 可能是容器之类的问题吧 懒得改了
52.返回容器的大小即可
代码
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 using namespace std; 5 int ressolveNQueens(int n, vector<string> replace, vector<vector<string>> &result, vector<vector<int>>Standing,int row){ 6 for (int i = 0; i < replace[row].size(); i++) { 7 //判断是否可以放入 8 if (Standing[row][i] == 0) { 9 replace[row][i] = 'Q'; 10 Standing[row][i] += 1; 11 //如果最后一行也可以放入 就是解 12 if (row == n - 1) { 13 result.push_back(replace); 14 return 1; 15 } 16 //横向直接切 17 for (int j = 1; j < Standing.size(); j++) { 18 //列 19 if (row + j < Standing.size()) { 20 Standing[row + j][i] += 1; 21 } 22 //右对角线 23 if (row + j < Standing.size() && i + j < Standing.size()) { 24 Standing[row + j][i + j] += 1; 25 } 26 //左对角线 27 if (row + j < Standing.size() && i - j > -1) { 28 Standing[row + j][i - j] += 1; 29 } 30 } 31 //递归 32 ressolveNQueens(n, replace, result, Standing, row + 1); 33 //回溯 34 replace[row][i] = '.'; 35 Standing[row][i] -= 1; 36 for (int j = 1; j < Standing.size(); j++) { 37 if (row + j < Standing.size()) { 38 Standing[row + j][i] -= 1; 39 } 40 if (row + j < Standing.size() && i + j < Standing.size()) { 41 Standing[row + j][i + j] -= 1; 42 } 43 if (row + j < Standing.size() && i - j > -1) { 44 Standing[row + j][i - j] -= 1; 45 } 46 } 47 } 48 } 49 return 0; 50 } 51 52 53 using namespace std; 54 class Solution { 55 public: 56 vector<vector<string>> solveNQueens(int n) { 57 vector<string> replace(n, string(n, '.')); 58 vector<vector<string>> result; 59 vector<vector<int>>Standing(n, vector<int>(n, 0)); 60 ressolveNQueens(n, replace, result, Standing,0); 61 return result; 62 } 63 }; 64 65 int main() { 66 Solution sol; 67 vector<vector<string>> result=sol.solveNQueens(5); 68 for (int i = 0; i < result.size(); i++) { 69 cout << i << endl; 70 for (int j = 0; j < result[i].size(); j++) { 71 cout << result[i][j] << endl; 72 } 73 cout << endl; 74 } 75 }