题目:
题解:深度优先搜索DFS
1. 解释一:
2. 解释二:
代码:深度优先搜索DFS
public class lc_529 {
// 定义 8 个方向
public static int[] dx = {-1, 1, 0, 0, -1, 1, -1, 1};
public static int[] dy = {0, 0, -1, 1, -1, 1, 1, -1};
public static char[][] updateBoard(char[][] board, int[] click) {
int x = click[0];
int y = click[1];
// 1. 若起点是雷,游戏结束,直接修改 board 并返回。 // 规则 1
if (board[x][y] == 'M') {
board[x][y] = 'X';
} else { // 2. 若起点是空地,则从起点开始向 8 邻域的空地进行深度优先搜索。
dfs(board, x, y);
}
return board;
}
public static void dfs(char[][] board, int i, int j) {
// 递归终止条件:判断空地 (i, j) 周围是否有雷,若有,则将该位置修改为雷数,终止该路径的搜索。
int count = 0;
for (int k = 0; k < 8; k++) {
int x = i + dx[k];
int y = j + dy[k];
if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) {
continue;
}
// 不用判断 M,因为如果有 M 的话游戏已经结束了
if (board[x][y] == 'M') {
count++;
}
}
if (count > 0) {
// 规则 3
board[i][j] = (char) (count + '0');
return;
}
// 若空地 (i, j) 周围没有雷,则将该位置修改为 ‘B’,向 8 邻域的空地继续搜索。 // 规则 2
board[i][j] = 'B';
for (int k = 0; k < 8; k++) {
int x = i + dx[k];
int y = j + dy[k];
// 这里不需要在存在 B 的时候继续扩展,因为 B 之前被点击的时候已经被扩展过了
if (x < 0 || x >= board.length || y < 0 || y >= board[0].length || board[x][y] != 'E') {
continue;
}
dfs(board, x, y);
}
}
public static void main(String[] args) {
char board[][] = {{'E', 'E', 'E', 'E', 'E'},
{'E', 'E', 'M', 'E', 'E'},
{'E', 'E', 'E', 'E', 'E'},
{'E', 'E', 'E', 'E', 'E'}};
int click[] = {3, 0};
char[][] updateBoard = updateBoard(board, click);
for (int i = 0; i < updateBoard.length; i++) {
for (int j = 0; j < updateBoard[0].length; j++) {
System.out.printf("%c ", updateBoard[i][j]);
}
System.out.println();
}
}
}