題目地址:529. 掃雷游戲
思路:
深度優(yōu)先
public class Solution {
// 坐標相鄰的8個方向 上,下,左,右,左上,左下,右上,右下
private int[][] dirs = {{0,1},{0,-1},{-1,0},{1,0},{-1,1},{-1,-1},{1,1},{1,-1}};
public char[][] updateBoard(char[][] board, int[] click) {
// 獲取當(dāng)前坐標
int row = click[0], col = click[1];
// 邊界條件
int m = board.length, n = board[0].length;
// 如果找到M(未挖出的雷)或者X(已挖出的雷)游戲結(jié)束
if (board[row][col] == 'M' || board[row][col] == 'X') {
board[row][col] = 'X';
return board;
}
// 找周邊有幾個雷
int num = 0;
for (int[] dir : dirs) {
int newRow = dir[0] + row;
int newCol = dir[1] + col;
// 如果周圍是未被揭開的雷,周圍雷的數(shù)量遞增
if (newRow >= 0 && newCol >= 0 && newRow < m && newCol < n && board[newRow][newCol] == 'M') {
num++;
}
}
// 如果周圍有雷
if (num > 0) {
board[row][col] = (char) (num + '0');
return board;
}
// 如果一個沒有相鄰地雷的空方塊('E')被挖出,修改它為('B')
board[row][col] = 'B';
for (int[] dir : dirs) {
int newRow = dir[0] + row;
int newCol = dir[1] + col;
// 所有和其相鄰的未挖出方塊都應(yīng)該被遞歸地揭露。
if (newRow >= 0 && newCol >= 0 && newRow < m && newCol < n && board[newRow][newCol] == 'E') {
updateBoard(board,new int[]{newRow,newCol});
}
}
return board;
}
}