用深度優先搜索(DFS)(回溯法)解決N皇后問題(Leetcode 51)

之前介紹了基於全排列的方式解決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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章