力扣 题目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 }
View Code

 

posted @ 2022-05-14 14:33  无聊的阿库娅  阅读(17)  评论(0编辑  收藏  举报