leetcode529. Juego buscaminas / dfs, bfs

Asunto: 529. Juego de barrido de minas

¡Juguemos juntos a juegos de buscaminas!

Dada una matriz de caracteres bidimensional que representa el tablero de juego. 'M' representa una mina ondulada, 'E' representa un cuadrado vacío que no ha sido cavado y 'B' representa minas sin adyacentes (arriba, abajo, izquierda, derecha y las 4 diagonales). Para el cuadrado en blanco excavado, el número ('1' a '8') indica cuántas minas hay adyacentes a este bloque excavado, y la 'X' significa una mina excavada.

Ahora proporcione la siguiente posición de clic (índice de fila y columna) en todos los cuadrados sin excavar ('M' o 'E'), de acuerdo con las siguientes reglas, regrese al panel correspondiente después de hacer clic en la posición correspondiente:

Si se extrae una mina ('M'), el juego se sobrecambia a 'X'.
Si se excava un bloque vacío ('E') sin minas adyacentes, cámbielo a ('B'), y todos los bloques adyacentes no excavados deben revelarse de forma recursiva.
Si se excava un cuadrado vacío ('E') adyacente a al menos una mina, modifíquelo a un número ('1' a '8'), indicando el número de minas adyacentes.
Si no hay más cuadrados para revelar durante este clic, regrese al panel.

Ejemplo 1:

entrar:

[['E', 'E', 'E', 'E', 'E'],
['E', 'E', 'M', 'E', 'E'],
['E', 'E', 'E', 'E', 'E'],
['E', 'E', 'E', 'E', 'E']]

Haga clic en: [3,0]

Salida:

[['B', '1', 'E', '1', 'B'],
['B', '1', 'M', '1', 'B'],
['B', '1', '1', '1', 'B'],
['B', 'B', 'B', 'B', 'B']]

Explicación:Inserte la descripción de la imagen aquí

Ejemplo 2:

entrar:

[['B', '1', 'E', '1', 'B'],
['B', '1', 'M', '1', 'B'],
['B', '1', '1', '1', 'B'],
['B', 'B', 'B', 'B', 'B']]

Haga clic en: [1,2]

Salida:

[['B', '1', 'E', '1', 'B'],
['B', '1', 'X', '1', 'B'],
['B', '1', '1', '1', 'B'],
['B', 'B', 'B', 'B', 'B']]

Explicación:

Inserte la descripción de la imagen aquí

Nota:

  1. El rango de ancho y alto de la matriz de entrada es [1,50].
  2. La posición en la que se hizo clic solo puede ser un bloque que no se haya excavado ('M' o 'E'), lo que también significa que el panel contiene al menos un bloque en el que se puede hacer clic.
  3. El panel de entrada no será el estado en el que terminó el juego (es decir, se han excavado las minas).
  4. En aras de la simplicidad, las reglas no mencionadas pueden ignorarse en esta pregunta. Por ejemplo, no necesitas excavar todas las minas cuando termina el juego, considera todas las situaciones en las que podrías ganar el juego o marcar los cuadrados.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/minesweeper Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Idea básica: dfs

class Solution {
public:
    int row, col;
    vector<vector<int>> dir;
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        dir = {
   
   {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
        row = board.size();
        if(row == 0)
            return board;
        col = board[0].size();
        dfs(board, click[0], click[1]);
        return board;
    }
    void dfs(vector<vector<char>> &board, int x, int y){
        if(board[x][y] == 'X' || (board[x][y] >= '1' && board[x][y] <= '8'))
            return;
        if(board[x][y] == 'M'){
            board[x][y] = 'X';
            return;
        }
        if(board[x][y] == 'E'){
            int cnt = 0;
            for(auto d : dir){
                int cx = x + d[0];
                int cy = y + d[1];
                
                if(judge_pos(cx, cy) && (board[cx][cy] == 'M' || board[cx][cy] == 'X') )
                    ++cnt;
                
            }
            if(cnt == 0){
                board[x][y] = 'B';
                for(int i = 0; i < 8; ++i){
                    int tx = x + dir[i][0];
                    int ty = y + dir[i][1];
                    if(judge_pos(tx, ty))
                        dfs(board, tx, ty);
                }                   
            }
            else{
                board[x][y] = ('0' + cnt);
            }
        }
        
    }
    bool judge_pos(int x, int y){
        return x >= 0 && x < row && y >= 0 && y < col;
    }
};

Por supuesto, también puede usar bfs para esta pregunta

Supongo que te gusta

Origin blog.csdn.net/qq_31672701/article/details/108130298
Recomendado
Clasificación