码迷,mamicode.com
首页 > 编程语言 > 详细

算法整理-回溯和DFS

时间:2019-06-24 23:57:01      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:can   size   表示   搜索结果   osd   public   个数   oid   vector   

一.  八皇后问题

     第一种解法将棋盘的所有格子都初始化为‘.’,  定义递归函数为前l-1行的格子已经排好(给定排面的情况下), 从第l层开始继续排得到的八皇后搜索结果。具体做法是从第l行的每一个列逐列尝试,如果不冲突则加入,再进行l+1的问题求解,求解完后进行回溯。空间复杂度为O(N*N)

class Solution {
public:
    int totalNQueens(int n) {
        vector<vector<int>> round(n, vector<int>(n, 0));
        int total = 0;
        btsearch(round, 0, n, total);
        return total;
    }

private:
    void btsearch(vector<vector<int>> &round, int t, int n, int &total) {
       if (t == n) {
           total++;
           return;
           }
       for (int i = 0; i < n; i++) {
            
            if (isok(round, t, i)) {
                round[t][i] = 1;
                btsearch(round, t+1, n, total);
                round[t][i] = 0;
            }
           
       }
    }

    bool isok(const vector<vector<int>>round, int t, int j) {
       int n = round.size();
       for (int c=0; c<t; c++) {
           if (round[c][j] == 1) return false;
       }
       for (int r=0; r<j; r++) {
           if (round[t][r] == 1) return false;
       }

       // 45 o
       for (int c=t-1, r=j+1; c>=0 && r<n; c--, r++) {
           if (round[c][r] == 1) return false;
       }
      // 135 o
       for (int c=t-1, r=j-1; c>=0 && r>=0; c--, r-- ) {
           if (round[c][r] == 1) return false;
       }
     //  nqueque = 4。
     return true;
    }
};

 

class Solution {
public:
    int totalNQueens(int n) {
        vector<vector<int>> round(n, vector<int>(n, 0));
        int total = 0;
        btsearch(round, 0, n, total);
        return total;
    }

private:
    void btsearch(vector<vector<int>> &round, int t, int n, int &total) {
       if (t == n) {
           total++;
           return;
           }
       for (int i = 0; i < n; i++) {
            
            if (isok(round, t, i)) {
                round[t][i] = 1;
                btsearch(round, t+1, n, total);
                round[t][i] = 0;
            }
           
       }
    }

    bool isok(const vector<vector<int>>round, int t, int j) {
       int n = round.size();
       for (int c=0; c<t; c++) {
           if (round[c][j] == 1) return false;
       }
       for (int r=0; r<j; r++) {
           if (round[t][r] == 1) return false;
       }

 

 

 第二种方法类似,不过可以将格子表示成一个一维数组,第i个元素的值j表示将皇后放在第i行第j列

 

二. Permutation

 对一个数组进行全排列,无重复元素,定义递归函数为前i-1个元素全排列已经排好, 将第i个元素以及后面的元素进行全排列。过程为从第i个元素到最后一个元素轮流放在第i个位置上, 然后对第i+1个元素以及后续元素进行全排列。

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        permutehelper(nums, 0, res);
        return res;
    }

private:
    void permutehelper(vector<int>&nums, int l, vector<vector<int>> &res){
        if (l == nums.size()) {
            res.push_back(nums);}       
       for (int i = l; i < nums.size(); i++) {
                swap(nums[l], nums[i]);
                permutehelper(nums, l+1, res);
                swap(nums[i], nums[l]);
            }
   
    }  

};

   若有重复,则先进行sort, 并且轮流当头那部分相同的数字只能出现一次,

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        helper(nums, 0, res);
        return res;
    }

private:
    void helper(vector<int>& nums, int l, vector<vector<int>> &res) {
        if (l == nums.size()) res.push_back(nums);
        set<int> vis;
        for (int i=l; i< nums.size(); i++) {
                if (vis.count(nums[i])) continue;
                vis.insert(nums[i]);
                swap(nums[l], nums[i]);
                helper(nums, l+1, res);
                swap(nums[i], nums[l]);
        }
    }
};

 

三. 整数拆分

 

 

四. CombineSum

 

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> res;
        vector<int> out;
        btsearch(candidates, 0, target, out, res);
        return res;
    }

    void btsearch(vector<int> candidates,  int l, int target,  vector<int> &out, vector<vector<int>>&res) {
       if (target < 0) {
            return;
        }
       if (target == 0) {
           res.push_back(out);
           return;
       }
       for (int i = l ; i< candidates.size(); i++) {
           out.push_back(candidates[i]);
           btsearch(candidates, i, target - candidates[i], out, res);
           out.pop_back();
       }

    }
};

 

五. CombineSumII

class Solution {
public:
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
        vector<vector<int> > res;
        vector<int> out;
        sort(num.begin(), num.end());
        combinationSum2DFS(num, target, 0, out, res);
        return res;
    }
    void combinationSum2DFS(vector<int> &num, int target, int start, vector<int> &out, vector<vector<int> > &res) {
        if (target < 0) return;
        else if (target == 0) res.push_back(out);
        else {
            for (int i = start; i < num.size(); ++i) {
                if (i > start && num[i] == num[i - 1]) continue;
                out.push_back(num[i]);
                combinationSum2DFS(num, target - num[i], i + 1, out, res);
                out.pop_back();
            }
        }
    }
};

 

六. subsets

https://www.cnblogs.com/TenosDoIt/p/3451902.html

每一个元素有选择放或者不放两种选择。

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> out;
        helper(nums, 0, out, res);
        return res;
    }

private:
    void helper(vector<int>nums, int l, vector<int>&out, vector<vector<int>>&res) {
        if (l == nums.size()) {
            res.push_back(out);
            return;
        }
        out.push_back(nums[l]);
        helper(nums, l+1, out, res);
        out.pop_back();
        helper(nums, l+1, out, res);
    }
};

 

算法整理-回溯和DFS

标签:can   size   表示   搜索结果   osd   public   个数   oid   vector   

原文地址:https://www.cnblogs.com/cookcoder-mr/p/11080053.html

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