1 #include "000库函数.h"
2
3
4 //使用回溯法来计算
5 //经典解法为回溯递归,一层一层的向下扫描,需要用到一个pos数组,
6 //其中pos[i]表示第i行皇后的位置,初始化为 - 1,然后从第0开始递归,
7 //每一行都一次遍历各列,判断如果在该位置放置皇后会不会有冲突,以此类推,
8 //当到最后一行的皇后放好后,一种解法就生成了,将其存入结果res中,
9 //然后再还会继续完成搜索所有的情况,代码如下:17ms
10 class Solution {
11 public:
12 vector<vector<string>> solveNQueens(int n) {
13 vector<vector<string>>res;
14 vector<int>pos(n, -1);
15 NQueue(res, pos, 0);
16 return res;
17 }
18
19 void NQueue(vector<vector<string>>&res, vector<int>&pos, int t) {
20 int n = pos.size();
21 if (t == n) {//组合成功
22 vector<string>v(n, string(n, '.'));//这初始化绝逼了
23 for (int i = 0; i < n; ++i)
24 v[i][pos[i]] = 'Q';
25 res.push_back(v);
26 }
27 else
28 for (int k = 0; k < n; ++k)
29 if (Danger(pos, t, k)) {
30 pos[t] = k;
31 NQueue(res, pos, t + 1);
32 pos[t] = -1;//切记,关键点,回溯
33 }
34 }
35
36 bool Danger(vector<int>pos, int t, int k) {
37 for (int i = 0; i < t; ++i)
38 if (pos[i] == k || abs(t - i) == abs(pos[i] - k))
39 return false;
40 return true;
41 }
42
43 };
44
45
46 //通过使用排列进行判断是否可行进行求解
47 //但是太耗时了,还是用回溯法吧
48 class Solution {
49 public:
50 vector<vector<string>> solveNQueens(int n) {
51 vector<vector<string>>res;
52 vector<int>nums;
53 for (int i = 0; i < n; ++i)
54 nums.push_back(i);
55
56 if (Danger(nums)) {
57 vector<string>v;
58 for (int i = 0; i < n; ++i) {
59 string s = "";
60 for (int k = 0; k < nums[i]; ++k)
61 s += '.';
62 s += 'Q';
63 for (int k = nums[i] + 1; k < n; ++k)
64 s += '.';
65 v.push_back(s);
66 }
67 res.push_back(v);
68 }
69 while (next_permutation(nums.begin(), nums.end())) {
70 if (Danger(nums)) {
71 vector<string>v;
72 for (int i = 0; i < n; ++i) {
73 string s = "";
74 for (int k = 0; k < nums[i]; ++k)
75 s += '.';
76 s += 'Q';
77 for (int k = nums[i] + 1; k < n; ++k)
78 s += '.';
79 v.push_back(s);
80 }
81 res.push_back(v);
82 }
83 }
84 return res;
85 }
86
87
88
89 bool Danger(vector<int>nums) {//用来判断是否可行
90 for (int i = 0; i < nums.size(); ++i) {
91 for (int j = 0; j < nums.size(); ++j) {
92 if (j == i)continue;
93 if ((j + nums[j]) == (i + nums[i]) || (i - nums[i]) == (j - nums[j]))
94 return false;
95 }
96 }
97 return true;
98 }
99
100
101 };
102
103
104 void T051() {
105 Solution s;
106 vector<vector<string>>v;
107 int n;
108 n = 5;
109 v = s.solveNQueens(n);
110 for (auto &a : v) {
111 for (auto b : a)
112 cout << b << endl;
113 cout << "//////////////////////////" << endl;
114 }
115
116 }