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;
}
}