leetcode529 (juego de buscaminas: búsqueda de imágenes)

Dada una matriz de caracteres bidimensional que representa el tablero de juego. 'M' representa una mina sin excavar, 'E' representa un cuadrado vacío que no ha sido cavado y 'B' representa una mina que no tiene minas 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:

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

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']]

Solución del problema: el problema de búsqueda de gráficos convencional se puede resolver directamente mediante DFS recursivo sin cerebro

class Solution {
    
    
    public char[][] updateBoard(char[][] board, int[] click) {
    
    
            if(click[0]<0||click[0]>=board.length||click[1]<0||click[1]>=board[0].length)
                return board;
            if(board[click[0]][click[1]]=='M')
                board[click[0]][click[1]]='X';

            else{
    
    
                //search数组用于存储点的状态,来判断该点是否被搜索过
                boolean[][]search=new boolean[board.length][board[0].length];
                move(board,click[0],click[1],search);
            }
            return board;
    }
    private void move(char[][]board,int x,int y,boolean[][]search){
    
    
        if(!(x>=0&&x< board.length&&y>=0&&y<board[0].length))
            return;
         if(search[x][y])
             return;
         else{
    
    
             search[x][y]=true;
             if(board[x][y]!='E')
                 return;
         }
         //计算周围的地雷数
         int numOfM=check(x,y+1,board)+check(x,y-1,board)+check(x-1,y,board)+
                 check(x+1,y,board)+check(x+1,y+1,board)+check(x-1,y+1,board)+
                 check(x+1,y-1,board)+check(x-1,y-1,board);
         if(numOfM!=0)
               board[x][y]=Integer.toString(numOfM).charAt(0);
         else{
    
    
             board[x][y]='B';
             //递归推进搜索
             move(board,x+1,y,search);
             move(board,x-1,y,search);
             move(board,x,y+1,search);
             move(board,x,y-1,search);
             move(board,x+1,y-1,search);
             move(board,x-1,y-1,search);
             move(board,x+1,y+1,search);
             move(board,x-1,y+1,search);
         }
    }
    //判断该点是否有地雷
    private int check(int x,int y,char[][]board){
    
    
        if(x>=0&&x< board.length&&y>=0&&y<board[0].length){
    
    
               if(board[x][y]=='M')
                   return 1;
               else
                   return 0;
        }
        else
            return 0;
    }
}

Supongo que te gusta

Origin blog.csdn.net/CY2333333/article/details/108121011
Recomendado
Clasificación