题解 | #矩阵中的路径#

矩阵中的路径

https://www.nowcoder.com/practice/2a49359695a544b8939c77358d29b7e6

#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix char字符型vector<vector<>> 
     * @param word string字符串 
     * @return bool布尔型
     */

    
    bool hasPath(vector<vector<char> >& matrix, string word) {
        // write code here
        bool res = false;   // 开始并没有找到路径,初始化为false
        // for循环遍历每个位置,带着一个标记本子,记录走过位置
        for (int i = 0; i < matrix.size(); ++i) 
        {
            for(int j = 0; j < matrix[0].size(); ++j)
            {
                int w = 0;      // 每次更新一个开始点,都得从word的第一个单词位置开始遍历
                if(matrix[i][j] == word[w])
                {
                    // 找到新的开始点,则重置标记本子,初始化都是没有走过
                    vector<vector<bool>> board(matrix.size(), vector<bool>(matrix[0].size(), false));
                    // std::cout << " matrix "<< i << " " << j <<std::endl;
                    res = dfs(matrix, board, word, i, j, w);
                    if (res) {  
                        break; // 找到路径就退出
                    }
                }
            }
            if (res) {
                break;
            }
        }
        return res;
    }

    // 上下左右找路子,找到就继续往下找,否则return false
    bool dfs(vector<vector<char>>& matrix, vector<vector<bool>>& board, string& word, int i, int j, int w)
    {
        if(i < 0 || i > matrix.size() -1 || j < 0 || j > matrix[0].size()-1 || board[i][j] || matrix[i][j] != word[w])// 越界、已走过或不等于,则终止
        {
            // std::cout << i << " " << j << " " << w << " false "<<std::endl;
            return false;
        }else if(w == word.size() -1)  // 找到word最后一个单词则返回true
        {
            // std::cout << i << " " << j << " " << w << " true "<<std::endl;
            return true;
        }
        // 遍历过,则给board的元素设置为true
        board[i][j] = true;
        // 往上下左右找,找到则为true
        if(dfs(matrix, board, word, i-1, j, w+1)||
            dfs(matrix, board, word, i+1, j, w+1)||
            dfs(matrix, board, word, i, j-1, w+1)||
            dfs(matrix, board, word, i, j+1, w+1)
        ){
            // std::cout << " 4 if " << std::endl;
            return true;
        }
        // std::cout << board[i][j] << std::endl;
        board[i][j] = false;    // 若当前坐标四周都没有找到可行区域,则让本子中记录格子恢复记录为未走过;
                                // 因为可能其他坐标点关联的四周可作为可行区域,可手调例子 [[A,B,C],[B,E,D],[F,G,G]],"ABCDEBF" 体会
        return false;
    }
};

挤挤刷刷! 文章被收录于专栏

记录coding过程

全部评论

相关推荐

09-29 17:44
已编辑
蔚来_测(准入职员工)
//鲨鱼辣椒:见不了了我实习了四个月上周再投筛选了一天就给我挂了
点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务