用深度优先搜索(DFS)(回溯法)解决N皇后问题(Leetcode 51)
来源:互联网 发布:程序侠 源码 编辑:程序博客网 时间:2024/04/28 11:49
之前介绍了基于全排列的方式解决N皇后的问题:
http://blog.csdn.net/bcj296050240/article/details/51107433
本文介绍基于DFS的方法解决该问题,依旧是Leetcode51的问题:
- DFS基于递归,每次搜索填充一行,如果当前填充值满足条件,则递归的填充下一行。如果不满足条件,则循环,如果循环所有值都不满足条件,则回溯。
- 当填充完毕所有行时,得到一个可行解,记录并返回上一层。
- 直到递归到所有行的所有填充可能都尝试过之后,停止。
其中isvalid判断当前第row行填充col是否会引起棋盘非法,如果棋盘合法则返回true,否则返回false.
其中ConvertSol函数跟之前博文中的一样,是为了将解空间转换为字符串形式。
代码如下:
class Solution {public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> sol; vector<vector<int>> res; vector<int> arr(n); int start = 0, end = n-1; DFS(res, arr, start, end); convertSol(res, sol); return sol; } //深度优先搜索 //当前已经搜索到底start行,总共有end行 void DFS(vector<vector<int>> &res, vector<int> &arr, int start, int end) { if(start == end+1){ res.push_back(arr); return ; } //循环0-end,表示应该给第start行的编号为 i 的位置放置皇后 for(int i = 0; i <= end; ++i){ if(isvalid(arr, start, i)){ arr[start] = i; DFS(res, arr, start+1, end); } } } //当前放置到第row行,要在第row行的第col的位置放置皇后。该函数检测这种放置方法是否合法 bool isvalid(vector<int> &arr, int row, int col){ for(int i = 0;i < row;i++){ //是否在同一列? 是否在同一条对角线上 if(arr[i] == col || abs(i-row) == abs(arr[i]-col)){ return false; } } return true; } void convertSol(vector<vector<int>> &res, vector<vector<string>> &sol){ for(int i = 0;i < res.size();++i){ vector<string> vec; for(int j = 0;j < res[i].size();++j){ int pos = res[i][j]; int k = 0; string str; while(k < pos){ str += "."; ++k; } str += "Q"; ++k; while(k < res[i].size()){ str += '.'; ++k; } vec.push_back(str); } sol.push_back(vec); } }};int main(){ Solution sul; int n = 4; vector<vector<string>> res = sul.solveNQueens(n); for(int i = 0;i < res.size();++i){ cout<<"------------"<<endl; for(int j = 0;j < res[i].size();++j) cout<<res[i][j]<<endl; cout<<endl; } getchar(); return 0;}
0 0
- 用深度优先搜索(DFS)(回溯法)解决N皇后问题(Leetcode 51)
- HDU 2553 N皇后问题(回溯法/深度优先搜索)
- hdu2553 N皇后问题(回溯dfs)
- HDU 2553 N皇后问题 (回溯 深度优先搜索)
- 回溯法解决2n皇后(8皇后)问题
- 回溯法解决N皇后问题(java实现)
- 回溯--深度优先搜索(数字n的组合数)
- code【vs】1295 N皇后问题(dfs(回溯))
- HDU 2553 N皇后问题 (DFS+回溯)
- HDU 2553 N皇后问题 (回溯DFS)
- hdu 2553 N皇后问题 DFS(回溯)
- 深度优先搜索DFS(迷宫问题)
- BZOJ 4809: 皇后 (n皇后问题)dfs搜索入门
- N皇后问题(回溯)
- N皇后问题(回溯)
- n皇后问题(回溯)
- POJ 1321 棋盘问题(DFS深度优先搜索/回溯法)
- POJ 1321 棋盘问题(DFS深度优先搜索/回溯法)
- ng-class
- Hibernate单向一对一关联
- 015.php循环while
- 用Python写一个文本转HTML的脚本
- L1-6. 连续因子
- 用深度优先搜索(DFS)(回溯法)解决N皇后问题(Leetcode 51)
- Mycat web MyCat Server
- ng-attr-(suffix)
- 爬虫是什么?
- JSTL fmt 格式化日期时间
- Android绘图机制与处理技巧-更新中
- JavaSE学习笔记_18:Java-IO流
- NYOJ284坦克大战
- 2016华为机试之矩形重合面积