zoukankan      html  css  js  c++  java
  • 【LeetCode-回溯】矩阵中的路径

    题目描述

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

    [["a","b","c","e"],
    ["s","f","c","s"],
    ["a","d","e","e"]]

    但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

    示例:

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

    说明:

    • 1 <= board.length <= 200;
    • 1 <= board[i].length <= 200;
    • 这题是《剑指Offer》的第 12 题;

    题目链接: https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/

    思路

    如果在递归的过程中要牵扯到选择,则使用回溯来做。如果当前位置 board[i][j] 与 word 中的字母相同,则移动当前位置匹配 word 的下一个字母。代码如下:

    class Solution {
    public:
        bool exist(vector<vector<char>>& board, string word) {
            if(word.empty()) return true;
            if(board.empty() || board[0].empty()) return false;
    
            int m = board.size();
            int n = board[0].size();
            for(int i=0; i<m; i++){
                for(int j=0; j<n; j++){
                    if(ans) return true;
                    if(board[i][j]==word[0]){
                        board[i][j] = '-';
                        dfs(board, i, j, 1, word);
                        board[i][j] = word[0];
                    }
                }
            }
            return ans;
        }
    
        void dfs(vector<vector<char>>& board, int& r, int& c, int cur, string& word){
            if(cur>=word.size()){
                ans = true;
                return;
            }
            if(ans) return;
    
            for(int k=0; k<4; k++){
                int nr = r + dirs[k][0];
                int nc = c + dirs[k][1];
                if(nr>=0 && nr<board.size() && nc>=0 && nc<board[0].size() && board[nr][nc]==word[cur]){
                    board[nr][nc] = '-';
                    cur++;
                    dfs(board, nr, nc, cur, word);
                    cur--;
                    board[nr][nc] = word[cur];
                }
            }
        }
    
    private:
        int dirs[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
        bool ans = false;
    };
    

    代码中没有使用 visit 数组来标记 board 的元素是否访问过,而是直接将 board 中的元素设为 - 表示该元素已经访问过了。在回溯的过程中,设置为原来的字母用来做下一个选择。

  • 相关阅读:
    K210识别水果模型
    一键开关机短路
    Arudino IDE添加STM32官方管理器stm32duino / Arduino_Core_STM32
    ESP32 Ble
    Blynk软件配置及Mixly编程教程
    Laravel安装及配置,完成基础的demo
    electron下载/打包慢?解决办法.....
    ESP32+PHP+MYSQL 搭建自己的物联网平台Demo
    PCA9536读写测试之MicroPython
    MSF实验2
  • 原文地址:https://www.cnblogs.com/flix/p/13365276.html
Copyright © 2011-2022 走看看