La espada se refiere a la Oferta 12. El camino en la matriz (DFS + poda)

Diseñe una función para determinar si hay una ruta que contenga todos los caracteres de una cadena en una matriz. La ruta puede comenzar desde cualquier cuadrícula en la matriz, y cada paso puede mover una cuadrícula hacia la izquierda, derecha, arriba y abajo en la matriz. Si una ruta pasa a través de una cuadrícula de la matriz, la ruta no puede volver a ingresar a la cuadrícula. Por ejemplo, la siguiente matriz de 3 × 4 contiene una ruta para la cadena de caracteres "bfce" (las letras de la ruta están marcadas en negrita).

[[“A”, “b”, “c”, “e”],
[“s”, “f”, “c”, “s”],
[“a”, “d”, “e”, "mi"]]

Pero la matriz no contiene la ruta de la cadena "abfb", porque después de que el primer carácter b de la cadena ocupa la segunda cuadrícula en la primera fila de la matriz, la ruta no puede ingresar a esta cuadrícula nuevamente.

Ejemplo 1:

Entrada: tablero = [["A", "B", "C", "E"], ["S", "F", "C", "S"], ["A", "D", "E", "E"]], palabra = "ABCCED"
Salida: verdadero
Ejemplo 2:

Entrada: tablero = [["a", "b"], ["c", "d"]], palabra = "abcd"
Salida: falso

análisis:

La idea de retroceder analiza la recursividad de cada nodo después de moverse hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha 通过对上下左右四个边界和当前元素与当前步数对应的值(board[i][j]与word[k])不同来进行剪枝. el código se muestra a continuación:

class Solution {
    
    
public:
    bool exist(vector<vector<char>>& board, string word) {
    
    
        int m = board.size();
        int n = board[0].size();
        for(int i = 0; i < m; i++){
    
    
            for(int j = 0; j < n; j++){
    
    
                if(dfs(board, word, i, j, 0)) return true;
            }
        }
        return false;
    }
    bool dfs(vector<vector<char>>& board, string word, int i, int j, int k){
    
    
        if(i > board.size() - 1 || i < 0 || j < 0 || j > board[0].size() -1 || board[i][j] != word[k]){
    
    
            return false;
        }
        if(k == word.size() - 1) return true;
        board[i][j] = '\0'; // 避免重复访问
        bool res = dfs(board, word, i - 1, j, k + 1) || dfs(board, word, i + 1, j, k + 1) || 
                   dfs(board, word, i, j - 1, k + 1) || dfs(board, word, i, j + 1, k + 1);
        board[i][j] = word[k]; // 回溯上一步,还原被访问的位置
        return res;

    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_34612223/article/details/114324987
Recomendado
Clasificación