1. 程式人生 > >力扣算法題—051N皇後問題

力扣算法題—051N皇後問題

include push_back 使用 || urn perm clas 沖突 queen

  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 }

力扣算法題—051N皇後問題