La espada se refiere al camino en la matriz OFERTA 12

1. Descripción del tema

Dado un tablero de cuadrícula de caracteres bidimensional mxn y una palabra de cadena. Devuelve verdadero si la palabra existe en la cuadrícula; de lo contrario, devuelve falso.

Las palabras deben formarse alfabéticamente, a través de letras en celdas adyacentes, donde las celdas "adyacentes" son aquellas que son adyacentes horizontal o verticalmente. No se permite el uso repetido de letras en la misma celda.

ejemplo

inserte la descripción de la imagen aquí

ideas para resolver problemas

Esta pregunta es un problema típico de búsqueda matricial, que se puede resolver utilizando la búsqueda en profundidad (DFS) + poda.

  • Búsqueda en profundidad, búsqueda de fuerza bruta para cada ruta posible, comenzando desde la esquina superior izquierda, primero busque en una dirección, si encuentra un punto desigual, regrese al punto igual anterior o punto de partida, y continúe atravesando en una nueva dirección .
  • Dirección dirs{ {0,1},{0,-1},{1,0},{-1,0}}:{abajo, arriba, derecha, izquierda}, antes de que comience el recorrido, juzgue si el nodo continúa para atravesar Si excederá el límite. Si está dentro del límite, primero juzgue si el nuevo nodo ha sido atravesado y, si lo ha sido, continúe hasta el nuevo nodo en la siguiente dirección. Use una visita[i][j] para registrar los nodos atravesados ​​en esta ronda. Establezca el nodo en falso al retroceder;
  • Poda : en la búsqueda, si la ruta no puede coincidir correctamente con la cadena dada, debe devolverse inmediatamente, lo que se denomina poda factible.

inserte la descripción de la imagen aquí

class Solution {
    
    
private:
    int row;
    int col;
    bool check(vector<vector<char>>& board,string s,int i,int j,int k){
    
    
        if(i < 0 || i >= row || j <0 || j >= col || board[i][j] != s[k]) return false;
        if(k == s.size()-1) return true;
        board[i][j] = '\0';//遍历过的位置改成空格做标记
        bool res = check(board,s,i,j+1,k+1) || check(board,s,i,j-1,k+1) ||check(board,s,i+1,j,k+1) || check(board,s,i-1,j,k+1);
                   
        board[i][j] = s[k];//回溯
        return res;
    }
public:
    bool exist(vector<vector<char>>& board, string word) {
    
    
        row = board.size();
        col = board[0].size();
        for(int i = 0;i < row;i++){
    
    
            for(int j = 0;j < col;j++){
    
    
                if(check(board,word,i,j,0)) return true;
            }
        }
        return false;
    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_43679351/article/details/125005368
Recomendado
Clasificación