用深度优先搜索(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