leetcode 79 单词搜索

博客转载了关于回溯法的内容,原文链接为https://www.cnblogs.com/joelwang/p/10929379.html ,回溯法是信息技术领域的重要算法。

 

回溯法:

/**
图搜索:
二维搜索起始点:
终止条件:
第一次找到该单词:当k>=word.size(),说明前k个字母已经全部找到,令res=true;return;
剪枝条件:
该方向的词与word对应的字母不相等:说明当前搜索分支不会有正确答案;
已经找到该单词(即res==true),说明在某一分支中已经找到了正确的字符串,当前分支不必再进行搜索;
新的字母坐标不在board中,或者已经被访问过;
**/

class Solution {
public:
    vector<vector<int>>dirs={{-1,0},{0,1},{1,0},{0,-1}};
    bool exist(vector<vector<char>>& board, string word) {
        
        bool res=false;
        int m=board.size();
        
        if(m==0) return false;
        int n=board[0].size();
        if(n==0&&word.size()==0)
            return true;
        vector<vector<int>> visit(m,vector(n,0));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(board[i][j]==word[0])
                    dfs(board,word,visit,res,i,j,0);
                if(res==true)
                    return res;
            }
        }
        return res;
    }
    void dfs(vector<vector<char>>& board,string &word,vector<vector<int>>&visit,bool& res,int i,int j,int k){
        //递归终点
        if(k>=word.size()){
            res=true;return;
        }
        //剪枝条件
        if(i<0||i>=board.size()||j<0||j>=board[0].size()||board[i][j]!=word[k]||visit[i][j]==1||res==true) return;
        visit[i][j]=1;
        for(auto dir:dirs){
            dfs(board,word,visit,res,i+dir[0],j+dir[1],k+1);
        }
        visit[i][j]=0;
    }
};

 

转载于:https://www.cnblogs.com/joelwang/p/10929379.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值