女王LeetCode51 N - DFS +古典的なバック(3-ソリューション)

コードは以下の通りであります:

 1 class Solution {
 2 public:
 3     // record[row]  该行对应的列
 4     vector<vector<string> > ans;   // 结果集
 5     vector<vector<string>> solveNQueens(int n) {
 6         string s = "";
 7         for(int i=0; i<n; i++){
 8             s += '.';
 9         }
10         vector<int> record(n);   // 记录每行对应的列
11         vector<string> temp(n, s);   // 临时解,需要push到ans中
12         dfs(0, n, temp, record);
13         return ans;
14     }
15     
16     void dfs(int row, int n, vector<string> &temp, vector<int> &record){
17         if(row == n){   // 到达最后一行,需要做处理,dfs出口
18             ans.push_back(temp);  // 已经得到最优方案,直接返回,需要push到ans数组中。
19             return;
20         }
21         for(int i=0; i<n; i++){ // 对于每一列
22             record[row] = i;
23             if(isOK(record, row)){
24                 // 下面三行回溯经典代码
25                 temp[row][i] = 'Q';
26                 dfs(row+1, n, temp, record);
27                 temp[row][i] = '.';   // 进行回溯!!!
28             }
29         }
30     }
31     
32     bool isOK(vector<int> &record, int row){   // 判断row行旗子是否满足要求,三个要求画个图思考一下
33         for(int i=0; i<row; i++){  // 遍历row前面的每一行,是否冲突
34             if(record[row] == record[i] || row - record[row]==i-record[i] || 
35                row+record[row]==i+record[i])    return false;
36         }
37         return true;
38     }
39 };

 

 

 

 

おすすめ

転載: www.cnblogs.com/conghuang/p/11833944.html