剑指 Offer 12. 矩阵中的路径

题目描述
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
输入样例

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

代码实现

vector <int> direction= {-1,0,1,0,-1};
//board表示单词矩阵,i,j表示坐标,start表示word的下标
void backTracking(vector<vector<char>>& board,int i,int j,int start,vector<vector<bool>>&visited,string word,bool &flag)
{    if(i<0||i>=board.size()||j<0||j>=board[0].size()||visited[i][j]||flag||(board[i][j]!=word[start]))
    {
        return;
    }
    if(start==word.size()-1)
    {
        flag=true;
        return ;
    }

    visited[i][j]=true;

    for(int k=0; k<4; k++)
    {
        int x=i+direction[k];
        int y=j+direction[k+1];
        backTracking(board,x,y,start+1,visited,word,flag);
    }
    visited[i][j]=false;
}
bool exist(vector<vector<char>>& board, string word)
{
    int n=board.size();//定义矩阵的行数
    int m=board[0].size();//定义矩阵的列数
    int lens=word.size();
    // cout<<"矩阵的行数为:"<<n<<",矩阵的列数为:"<<m<<endl;
    // vector<vector<bool>> visited(n, vector<bool>(m, false));
    if(lens>m*n)
    {
        return false;
    }
    bool flag=false;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(board[i][j]==word[0]){
            vector<vector<bool>> visited(n, vector<bool>(m, false));
            backTracking(board,i,j,0,visited,word,flag);
            if(flag==true)
                return flag;
        }
    }
}
return flag;
}
int main()
{
    vector<vector<char>>board= {{'b'}};
    string word="b";
    if(exist(board,word))
    {
        cout<<"T"<<endl;
    }
    else
    {
        cout<<"F"<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值