码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode51 N皇后——经典dfs+回溯(三段式解法)

时间:2019-11-11 12:28:47      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:ack   记录   ret   dfs   bool   span   ||   解法   void   

技术图片

代码如下:

 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 };

 

 

 

 

LeetCode51 N皇后——经典dfs+回溯(三段式解法)

标签:ack   记录   ret   dfs   bool   span   ||   解法   void   

原文地址:https://www.cnblogs.com/conghuang/p/11833944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!