[算法] 深搜整理

2023-11-07

深搜

之前在leetcode上刷题一直都对这个知识点比较模糊,最近,集中写了几道深搜的题目,将自己的思路和题目做了整理写下此篇博客。博客很多题目是网上提供的一些深搜题目,另外一些是leetcode上关于深搜的题目。

六角填数

如下图所示六角形中,填入1~12的数字。使得每条直线上的数字之和都相同。 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
在这里插入图片描述
针对下面代码,将整个六角形的每个元素加上标号,标号的规则是从上往下,如下图:
在这里插入图片描述
最终12个点的结果:1 8 9 2 7 10 12 6 5 4 11 3

#include <iostream>
#include <vector>

using namespace std;

class Solution {
private:
    int n;
    int ff;
    vector<int> Star; // 记录每个点的值
    vector<bool> visit; // 记录当前值是否被用过
public:
    Solution(int n_, int find_index) {
        // n为点的个数,ff为我们最终需要找的点的序号(序号从1开始,到12截至,包括12)
        n = n_;
        ff = find_index;
        for (int i = 0; i <= n; i++) {
            Star.push_back(0);
            visit.push_back(false);
        }
        Star[1] = 1;
        Star[2] = 8;
        Star[12] = 3;
        visit[1] = true;
        visit[8] = true;
        visit[3] = true;
    };

    void dfs(int i);

    void check();

    void printInfo();
};

void Solution::printInfo() {
    cout << "Result: " << Star[ff] << endl;
}

void Solution::check() {
    vector<int> tmp;
    tmp.push_back(Star[1] + Star[3] + Star[6] + Star[8]);
    tmp.push_back(Star[1] + Star[4] + Star[7] + Star[11]);
    tmp.push_back(Star[8] + Star[9] + Star[10] + Star[11]);
    tmp.push_back(Star[2] + Star[3] + Star[4] + Star[5]);
    tmp.push_back(Star[2] + Star[6] + Star[9] + Star[12]);
    tmp.push_back(Star[5] + Star[7] + Star[10] + Star[12]);
    for (int i = 1; i < 6; i++) {
        if (tmp[i] != tmp[i - 1])
            return;
    }
    printInfo();
}

void Solution::dfs(int i) {
    if (i == n + 1) {
        check();
    }
    if (i == 1 || i == 2 || i == 12) {
        dfs(i + 1);
    }
    for (int j = 1; j < n + 1; ++j) {
        if (!visit[j]) {
            visit[j] = true;
            Star[i] = j;
            dfs(i + 1);
            visit[j] = false;
        }
    }
}


int main() {
    Solution s(12, 6);
    s.dfs(1);
}

复原IP地址(Leetcode)

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class Solution {
public:
    bool check(vector<string> strs, string s) {
        for (int i = 0; i < 4; i++) {
            if (stoi(strs[i]) > 255 || (stoi(strs[i]) == 0 && strs[i] != "0") ||
                (strs[i][0] == '0' && stoi(strs[i]) != 0))
                return false;
        }
        return true;
    }

    void dfs(int step, int begin, const string &s, vector<string> &strs, vector<string> &result) {
        if (step == 4) {
            if (begin == s.size() && check(strs, s)) {
                string strRes = "";
                for (int i = 0; i < 3; i++) {
                    strRes.append(strs[i]);
                    strRes.append(".");
                }
                strRes.append(strs[3]);
                result.push_back(strRes);
            }
        }
        for (int i = 1; i <= 3; i++) {
            if (begin + i <= s.size()) {
                strs.push_back(s.substr(begin, i));
                dfs(step + 1, begin + i, s, strs, result);
                strs.pop_back();
            }
        }
    }

    vector<string> restoreIpAddresses(string s) {
        vector<string> result;
        if (s.size() > 12 || s.size() < 4)
            return result;
        vector<string> strs;
        dfs(0, 0, s, strs, result);
        return result;
    }
};

int main(){
    Solution s;
    string ss = "25525511135";
    vector<string> strs = s.restoreIpAddresses(ss);
    for (int i = 0; i < strs.size(); ++i) {
        cout<< strs[i]<< endl;
    }
}

结果为:
255.255.11.135
255.255.111.35

N皇后问题

在N*N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

#include <iostream>
#include <vector>

using namespace std;

class Solution {
private:
    vector<bool> visited;
    vector<int> checkerboard;
    int count = 0; //存放共有多少种放法
    vector<vector<int>> record; // 存放不同方法
public:
    void solverNQueens(int);

    void dfs(int, int, vector<bool> &, vector<int> &);

    bool check(const vector<int> &);

    void printInfo();
};

void Solution::printInfo() {
    cout << "count: " << count << endl;
    for (int i = 0; i < record.size(); i++) {
        for (int j = 0; j < record[i].size(); j++) {
            cout << record[i][j] << " ";
        }
        cout << endl;
    }
}

bool Solution::check(const vector<int> &checkerboard) {
    // 检查是否有同行,同列, 对角线
    for (int i = 0; i < checkerboard.size(); ++i) {
        for (int j = i + 1; j < checkerboard.size(); ++j) {
            if (checkerboard[i] == checkerboard[j] || (abs(checkerboard[i] - checkerboard[j]) == abs(i - j)))
                return false;
        }
    }
    return true;
}

void Solution::dfs(int begin, int n, vector<bool> &visit, vector<int> &checkerboard) {
    if (begin == n) {
        if (check(checkerboard)) {
            count++;
            record.push_back(checkerboard);
        }
        return;
    }
    for (int i = 0; i < n; i++) {
        if (!visit[i]) {
            visit[i] = true;
            checkerboard[begin] = i;
            dfs(begin + 1, n, visit, checkerboard);
            visit[i] = false;
        }
    }
}

void Solution::solverNQueens(int n) {
    for (int i = 0; i < n; i++) {
        visited.push_back(false);
        checkerboard.push_back(-1);
    }
    dfs(0, n, visited, checkerboard);
}

int main() {
    Solution s;
    s.solverNQueens(9);
    s.printInfo();
}


子集(Leetcode)

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:

输入: nums = [1,2,3]
输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]

class Solution {
public:
    void dfs(int begin, const vector<int>& nums, vector<int>& subRes, vector<vector<int>> &res){
        for(int i=begin; i<nums.size(); i++){
            subRes.push_back(nums[i]);
            res.push_back(subRes);
            dfs(i+1, nums, subRes, res);
            subRes.pop_back();
        }
    }
    
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> subRes;
        res.push_back(subRes);
        dfs(0, nums, subRes, res);
        return res;
    }
};

PS:觉得这篇博客这题讲的特别好
一开始做这个题我没想到用dfs,因为通常使用dfs都是按某种规则遍历一个数组,然后判断是否符合要求。这个题没法确定一个准确的跳出条件。上述博客讲的思路是:我们添加一个新的元素就是一个新的子集,然后添加这个元素序号后面的元素,这样就可以保证不出现重复,当一层dfs结束,就好pop出一个元素,然后继续。

子集2 (Leetcode)

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。

示例:
输入: [1,2,2]
输出: [[2], [1], [1,2,2], [2,2], [1,2], [] ]

class Solution {
public:
    void dfs(int begin, const vector<int> &nums, vector<int> &tmp, vector<vector<int>> &res){
        for(int i=begin; i<nums.size(); i++){
            tmp.push_back(nums[i]);
            res.push_back(tmp);
            dfs(i+1, nums, tmp, res);
            tmp.pop_back();
            while(i<nums.size()-1 && nums[i]==nums[i+1])
                i++;
        }    
    }
    
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<int> tmp;
        vector<vector<int>> res;
        res.push_back(tmp);
        dfs(0, nums, tmp, res);
        return res;
    }
};

PS: 这题和上面题的区别就是给定数组里有重复元素,所以我们需要将数组排序,并加一个判断 :

while(i<nums.size()-1 && nums[i]==nums[i+1])   i++;

这个判断可以确保在删去元素后,再取元素的时候,不要取和刚刚取过的元素相等的元素

带分数

100 可以表示为带分数的形式:100 = 3 + 69258 / 714 , 还可以表示为:100 = 82 + 3546 / 197
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。

题目要求:
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Solution {
private:
    int count = 0;
    vector<bool> visit;
    vector<vector<int>> record;


public:
    void solverFraction(int);

    void printResult();

    void dfs(int, const int &, vector<int> &, vector<vector<int>> &);

    void check(int, vector<int> &, vector<vector<int>> &);

    int sum(int, int, const vector<int> &);
};

void Solution::printResult() {
    for (int i = 0; i < record.size(); i++) {
        for (int j = 0; j < record[i].size(); j++) {
            cout << record[i][j] << " ";
        }
        cout << endl;
    }
    cout << "count: " << count << endl;
}

int Solution::sum(int begin, int end, const vector<int> &tmp) {
    int total = 0;
    for (int i = begin; i < end; i++) {
        total = total * 10 + tmp[i];
    }
    return total;
}

void Solution::check(int target, vector<int> &tmp, vector<vector<int>> &res) {
    int x, y, z;
    for (int i = 1; i < 8; i++) {
        for (int j = i + 1; j < 9; j++) {
            x = sum(0, i, tmp);
            y = sum(i, j, tmp);
            z = sum(j, 9, tmp);
            if ((target - x) * z == y) {
                count++;
                vector<int> tt = {x, y, z};
                record.push_back(tt);
            }
        }
    }
}

void Solution::dfs(int begin, const int &n, vector<int> &tmp, vector<vector<int>> &result) {
    if (begin == 9) {
        check(n, tmp, result);
        return;
    }
    for (int i = 0; i < 9; i++) {
        if (!visit[i]) {
            visit[i] = true;
            tmp.push_back(i + 1);
            dfs(begin + 1, n, tmp, result);
            tmp.pop_back();
            visit[i] = false;
        }
    }

}

void Solution::solverFraction(int n) {
    for (int i = 0; i < 9; i++) {
        visit.push_back(false);
    }
    vector<int> tmp;
    vector<vector<int>> res;
    dfs(0, n, tmp, res);
}

int main() {
    int n;
    while (cin >> n) {
        Solution s;
        s.solverFraction(n);
        s.printResult();
    }
}


结果:
100
3 69258 714
81 5643 297
81 7524 396
82 3546 197
91 5742 638
91 5823 647
91 7524 836
94 1578 263
96 1428 357
96 1752 438
96 2148 537
count: 11

PS:这块刚开始写的有问题,在dfs迭代时候,begin+1写成了i+1,这两者有什么区别呢?目前发现,用i+1 tmp数组的长度可能不是9。i+1适合子集那种问题(生成的结果数组长度不一致,不需要visit数组维护的),begin+1适合结果数组长度固定的。
在这里插入图片描述

组合(Leetcode)

给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[[2,4], [3,4],[2,3],[1,2], [1,3], [1,4]]

class Solution {
public:
    void dfs(int begin, int end, const vector<int>& nums, vector<int>& tmp, vector<vector<int>>& res){
        if(tmp.size() == end){
            res.push_back(tmp);
            return;
        }
        for(int i=begin; i<nums.size(); i++){
            tmp.push_back(nums[i]);
            dfs(i+1, end, nums, tmp, res);
            tmp.pop_back();    
        }
    }
    
    vector<vector<int>> combine(int n, int k) {
        vector<int> nums;
        for(int i=1; i<=n; i++){
            nums.push_back(i);
        }
        vector<vector<int>> res;
        vector<int> tmp;
        dfs(0, k, nums, tmp, res);
        return res;
    }
};

全排列(Leetcode)

给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

class Solution {
public:
    void dfs(const vector<int> &nums,vector<vector<int>> & res, vector<int> & subRes, vector<bool> &visited, int begin){
        if(begin == nums.size()){
            res.push_back(subRes);
            return;
        }
        for(int i=0; i<nums.size(); i++){
            if(!visited[i]){
                visited[i] = true;
                subRes.push_back(nums[i]);
                dfs(nums, res, subRes, visited, begin+1);
                visited[i] = false;
                subRes.pop_back();
            }
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> subRes;
        vector<bool> visited(nums.size(), false);
        dfs(nums, res, subRes, visited, 0);
        return res;
    }
};

全排列2 (Leetcode)

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:
输入: [1,1,2]
输出:
[ [1,1,2], [1,2,1], [2,1,1] ]

class Solution {
public:
    void dfs(const vector<int> &nums,vector<vector<int>> & res, vector<int> & subRes, vector<bool> &visited, int begin){
        if(begin == nums.size()){
            res.push_back(subRes);
            return;
        }
        for(int i=0; i<nums.size(); i++){
            if(!visited[i]){
                visited[i] = true;
                subRes.push_back(nums[i]);
                dfs(nums, res, subRes, visited, begin+1);
                visited[i] = false;
                subRes.pop_back();
                while(i+1 < nums.size() && nums[i]==nums[i+1])
                    i++;
            }
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> subRes;
        vector<bool> visited(nums.size(), false);
        sort(nums.begin(), nums.end());
        dfs(nums, res, subRes, visited, 0);
        return res;
    }
};

组合总和(Leetcode)

// 有难度,需要复习

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。

示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[ [7], [2,2,3] ]

示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[ [2,2,2,2], [2,3,3], [3,5] ]

class Solution {
public:
    void dfs(int begin, const vector<int> & condidates, vector<int> & subRes, vector<vector<int>> & res, int target, int total){
        if(total == target){
            res.push_back(subRes);
            return;
        }
        else if(total > target)
            return;
        
        for(int i=begin; i<condidates.size(); i++){
            subRes.push_back(condidates[i]);
            dfs(i, condidates, subRes, res, target, total+condidates[i]);
            subRes.pop_back();
        }
    }
    
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<int> subRes;
        vector<vector<int>> res;
        sort(candidates.begin(), candidates.end());
        dfs(0, candidates, subRes, res, target, 0);
        return res;
    }
};

组合总和2(Leetcode)

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。

示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]

示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[ [1,2,2], [5] ]

class Solution {
public:
    void dfs(int begin, const vector<int> & candidates, vector<int> & subRes, vector<vector<int>> & res, int total, int target){
        if(total > target)
            return;
        else if(total == target){
            res.push_back(subRes);
            return;
        }
        for(int i=begin; i<candidates.size(); i++){
            subRes.push_back(candidates[i]);
            dfs(i+1, candidates, subRes, res, total+candidates[i], target);
            subRes.pop_back();
            while(i+1<candidates.size() && candidates[i]==candidates[i+1])
                i++;
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<int> subRes;
        vector<vector<int>> res;
        vector<bool> visited(candidates.size(), false);
        sort(candidates.begin(), candidates.end());
        dfs(0, candidates, subRes, res, 0, target);
        return res;
    }
};

括号生成(Leetcode)

// 需要复习

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:
[ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ]

class Solution {
public:
    void dfs(vector<string> &res, string tmp, int left, int right){
        if(left == 0 && right == 0){
            res.push_back(tmp);
            return;
        }
        if(left > 0) dfs(res, tmp+"(", left-1, right);
        if(left < right) dfs(res, tmp+")", left, right-1);
    }
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        dfs(res, "", n, n);
        return res;
    }
};

电话号码的字母组合(Leetcode)

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述

示例:

输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]

python版本

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        character = {'2': ['a', 'b', 'c'],
                    '3': ['d', 'e', 'f'],
                    '4': ['g', 'h', 'i'],
                    '5': ['j', 'k', 'l'],
                    '6': ['m', 'n', 'o'],
                    '7': ['p', 'q', 'r', 's'],
                    '8': ['t', 'u','v'],
                    '9': ['w', 'x', 'y', 'z']}
        if len(digits) == 0:
            return []
        res = character[digits[0]]
        for dig in digits[1:]:
            dig_map = character[dig]
            tmp_res = res
            res = []
            for ch in dig_map:
                tmp = [tt+ch for tt in tmp_res]
                res.extend(tmp)
             
        return res

C++版本

class Solution {
public:
    vector<vector<char>> charactor = {{'a', 'b', 'c'}, 
                                      {'d', 'e', 'f'},
                                      {'g', 'h', 'i'},
                                      {'j', 'k', 'l'},
                                      {'m', 'n', 'o'},
                                      {'p', 'q', 'r', 's'},
                                      {'t', 'u', 'v'},
                                      {'w', 'x', 'y', 'z'}
                                     };
    void dfs(int begin, string digits, vector<string> &res, string tmp){
        if(begin == digits.size() && tmp.size()==digits.size()){
            res.push_back(tmp);
            return;
        }
        for(int i=begin; i<digits.size(); i++){
            vector<char> cur_char = charactor[digits[i]-'0'-2];
            for(int j=0; j<cur_char.size(); j++){
                dfs(i+1, digits, res, tmp+cur_char[j]);
            }
        }
    }
    vector<string> letterCombinations(string digits) {
        vector<string> res;
        if(digits.size() == 0)
            return res;
        dfs(0, digits, res, "");
        return res;
    }
};

分割回文串 (Leetcode)

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]

class Solution {
public:
    bool isPar(string s){
        int begin = 0;
        int end = s.size()-1;
        while(begin < end){
            if(s[begin] != s[end])
                return false;
            begin++;
            end--;
        }
        return true;
    }
    void dfs(const string & s, int begin, vector<vector<string>> &res, vector<string> & cur_res){
        if(begin >= s.size()){
            res.push_back(cur_res);
            return;
        }
        for(int i=1; i<=s.size()-begin; i++){
            string sub = s.substr(begin, i);
            if(sub[0]==sub[sub.size()-1] && isPar(sub)){
                cur_res.push_back(sub);
                dfs(s, begin+i, res, cur_res);
                cur_res.pop_back();
            }
        }
    }
    
    vector<vector<string>> partition(string s){
        vector<vector<string>> res;
        vector<string> cur_res;
        dfs(s, 0, res, cur_res);
        return res;
    }
};

被围绕的区域(Leetcode)

给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。

找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。

示例:

X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:

X X X X
X X X X
X X X X
X O X X
解释:

被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

class Solution {
public:
    void dfs(vector<vector<bool>> & needChange, int x, int y, const vector<vector<char>> & board){
        if(x < 0 || y < 0 || x >= board.size() || y >= board[0].size()){
            return;
        }
        if(board[x][y] == 'O' && needChange[x][y]){
            needChange[x][y] = false;
            dfs(needChange, x-1, y, board);
            dfs(needChange, x+1, y, board);
            dfs(needChange, x, y-1, board);
            dfs(needChange, x, y+1, board);
        }
    }
    void solve(vector<vector<char>>& board) {
        if(board.size()==0)
            return;
        if(board[0].size()==0)
            return;
        vector<vector<bool>> needChange(board.size(), vector<bool>(board[0].size(), true));
        for(int i=0; i<board[0].size(); i++){
            if(board[0][i]=='O')
                dfs(needChange, 0, i, board);
            if(board[board.size()-1][i] == 'O')
                dfs(needChange, board.size()-1, i, board);
        }
        for(int j=1; j<board.size()-1; j++){
            if(board[j][0] == 'O')
                dfs(needChange, j, 0, board);
            if(board[j][board[0].size()-1] == 'O')
                dfs(needChange, j, board[0].size()-1, board);
        }
        for(int i=0; i<board.size(); i++){
            for(int j=0; j<board[0].size(); j++){
                if(board[i][j] == 'O' && needChange[i][j])
                    board[i][j] = 'X';
            }
        }
    }
};

单词搜索 (Leetcode)

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]

给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.

class Solution {
public:
    void dfs(const vector<vector<char>>& board, const string & word, int x, int y, vector<vector<bool>> visited, int begin, bool & result){
        // cout<< x<< " "<< y<< endl;
        if(begin == word.size()){
            result = true;
        }
        if(x < 0 || y < 0 || x >= board.size() || y >= board[0].size())
            return;
        if(board[x][y] == word[begin] && visited[x][y] == false && result==false){
            visited[x][y] = true;
            dfs(board, word, x-1, y, visited, begin+1, result);
            dfs(board, word, x+1, y, visited, begin+1, result);
            dfs(board, word, x, y-1, visited, begin+1, result);
            dfs(board, word, x, y+1, visited, begin+1, result);
        }
    }
    bool exist(vector<vector<char>>& board, string word) {
        if(board.size() == 0)
            return false;
        if(board[0].size() == 0)
            return false;
        bool result = false;
        vector<vector<bool>> visited(board.size(), vector<bool>(board[0].size(), false));
        for(int i=0; i<board.size(); i++){
            for(int j=0; j<board[0].size(); j++){
                if(board[i][j] == word[0]){
                    dfs(board, word, i, j, visited, 0, result);
                    if(result == false && (word.size() == (board.size()*board[0].size())))
                        return result;
                    if(result)
                        return true;
                }
            }
        }
        return result;
        
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[算法] 深搜整理 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • Linux上查找最大文件的3种方法

    Linux上查找最大文件的3种方法 第一种 ls 最简单的方法就是借助 ls 命令 因为 ls 命令本身输出是带文件大小信息的 比如 我要列出 data log 目录中的20个最大文件 可以 ls lSh data log head 20
  • mongouve的使用

    http my oschina net u 1026531 blog 188336
  • HTML的基础知识及(页面、多媒体、表格)标签

    1 HTML 什么是HTML 网络协议 hypertext markup language 超文本标记语言 2 环境准备 开发环境 sublime VScode editplus IDE hbuilder webstorm 运行环境 浏览器
  • 1-9九个数字不重复组成一个三位数加法算式,求出所有组合

    import java util ArrayList import java util List public class TestNumber public static void main String args int count 0
  • Java开发中的常见问题和解决方法:如何解决常见的性能和bug问题

    章节一 引言 在Java开发中 我们经常会面临各种各样的问题 包括性能问题和Bug 这些问题可能会导致应用程序的运行变慢 不稳定甚至崩溃 本文将介绍一些常见的Java开发问题 并提供解决这些问题的方法和技巧 帮助开发人员更好地处理性能和Bu
  • html 发件人怎么设置,a标签创建mailto链接发送电子邮箱用法详解

    在html5中 利用标签的mailto可以创建发送邮件到一个或多个电子邮箱的超链接功能 其用法详解如下 标签mailto最常见用法 这个用法是最常见的用法 在大多数情况下 我们都会使用这个方式发送电子邮件 1 发送一个邮箱 书写格式 联系博
  • STM32 开机一直进IDLE空闲中断的解决思路

    串口IDLE空闲中断 常用于串口DMA IDLE中断接收不定长数据 一开始玩DMA 调试程序在一直进入IDLE中断时候 可能是没有软件清零 STM32中文参考手册这么描述的 IDLE 检测到空闲线路 IDLE line detected 检
  • 热更新_ToLua学习示例 06_LuaCoroutine2

    function CoExample WaitForSeconds 1 作者封装的协程等待一秒 print WaitForSeconds end time UnityEngine Time time WaitForFixedUpdate 等
  • cas单点登录系列1.3:自定义登录页

    cas单点登录系列1 3 自定义登录页 cas提供登录页比较大众 我们根据需求进行自定义 所以本节会介绍登录页的一些内容 比较简单 大家可根据情况进行学习 文章目录 cas单点登录系列1 3 自定义登录页 前言 一 登录页组成 二 登录接口
  • java中使用jxls导出excel,excel单元格换行,多sheet页导出

    一 模板 jxls通过模板中的批注语法来渲染数据 所以写好模板已经成功了一大半 我的模板如下 这里我定义了两个sheet页 第一个sheet页就是汇总的 直接取数据遍历 第二个sheet页就是动态sheet页的模板 注意模板作用域的定义一定
  • Python总复习——简答题篇

    简答题篇 1 简述元祖 列表和字典的区别 2 简述局部变量和全部局变量的区别 3 简述闭包满足的三个条件 4 简述导入模块的方法 1 简述元祖 列表和字典的区别 名称 外形 存储结构 访问方式 是否可变类型 列表 中括号括起来的数据 可以存
  • 软件测试工程师技术发展规划 (2022初稿)

    软件测试工程师技术发展规划 2022 2022年3月18日22 19 04 1 不同Level的技术标准 1 1 级别一 测试工程师TE 1 1 1 主要工作内容 1 2 级别二 测试开发工程师 1 2 1 主要工作内容 1 2 2 工作组
  • Java中static关键字详解

    1 1概述 static是静态修饰符 什么叫静态修饰符呢 大家都知道 在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的 而所谓静态就是指在编译后所分配的内存会一直存在 直到程序退出内存才会释放这个空间 也就是只要程序在运行 那
  • Azure Blob Storage 基本用法上传/下载(Java)

    文章目录 简单概念 Blob Storage Azure Blob Storage的存储结构 Azure Storage Account Container Blob 操作 Maven依赖 创建Container对象 获取Blob列表 下载
  • 图像识别最好的算法,图片相似度识别算法

    现在人脸识别最有效的算法是什么 最好的人脸识别系统在理想情况下比人类识别的表现要好的多 但是一旦环境情况变糟 系统的表现就差强人意了 而计算机科学家们当然是非常想要开发出一种算法 在各种情况下都能够表现优异 现在 中国香港大学的汤晓鸥教授和
  • Three.js3D可视化介绍,以及本地搭建three.js官网

    一 什么是Three js three js官网 https threejs org Three js是一个基于WebGL的JavaScript 3D图形库 它可以轻松地在浏览器中创建3D场景和动画 同时 它支持外部模型和纹理的导入 让开发
  • Windows Server2012R2 VisualSVN4.2.2-Server在线修改密码搭建

    最近有个3 0 0的svn环境要升级可以web界面自助修改密码的 为了找到这个解决方案 我搜索了很多文章与资料 有不少文章提供的总是各种很隐约 好像它要藏着啥好东西似的 我觉得既然你选择了分享你的成果 那就应该把整个过程整理顺畅 而不是在文
  • python解决数组奇数和偶数位置排序问题

    题目描述 输入一个整数数组 实现一个函数来调整该数组中数字的顺序 使得所有的奇数位于数组的前半部分 所有的偶数位于数组的后半部分 并保证奇数和奇数 偶数和偶数之间的相对位置不变 题目解析 这个题目很简单 只需要判断数组中的元素是奇数还是偶数
  • 生成随机数函数:rand和srand

    头文件为 stdlib h rand 会随机生成一个位于 0 RAND MAX 之间的整数 RAND MAX 是
  • [算法] 深搜整理

    深搜 之前在leetcode上刷题一直都对这个知识点比较模糊 最近 集中写了几道深搜的题目 将自己的思路和题目做了整理写下此篇博客 博客很多题目是网上提供的一些深搜题目 另外一些是leetcode上关于深搜的题目 六角填数 如下图所示六角形