forked from fishercoder1534/Leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path_529.java
73 lines (68 loc) · 3.34 KB
/
_529.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.fishercoder.solutions;
import java.util.LinkedList;
import java.util.Queue;
public class _529 {
public static class Solution1 {
public char[][] updateBoard(char[][] board, int[] click) {
int m = board.length;
int n = board[0].length;
Queue<int[]> queue = new LinkedList();
queue.offer(click);
while (!queue.isEmpty()) {
int[] curr = queue.poll();
int currRow = curr[0];
int currCol = curr[1];
if (board[currRow][currCol] == 'M') {
/**This also covers the corner case: when click[] happens to be on a mine, then it'll exit directly.
* Otherwise, we'll just continue and mark this cell to be 'M' and keep processing all 'E' cells in the queue.*/
board[currRow][currCol] = 'X';
} else {
/**scan all four directions of this curr cell, count all mines, this includes 'X' and 'M' */
int count = 0;
for (int i = -1; i < 2; i++) {
for (int j = -1; j < 2; j++) {
if (i == 0 && j == 0) {
continue;
}
int nextRow = currRow + i;
int nextCol = currCol + j;
if (nextRow >= m || nextRow < 0 || nextCol >= n || nextCol < 0) {
continue;
}
if (board[nextRow][nextCol] == 'M' || board[nextRow][nextCol] == 'X') {
count++;
}
}
}
if (count > 0) {
/**There are mines around this cell, so update it with the number of mines*/
board[currRow][currCol] = (char) (count + '0');
} else {
/**There is no mines around this cell, so update it to be 'B'*/
board[currRow][currCol] = 'B';
/**then we'll also check all of its four surrounding cells, if it's 'E'. we'll also update it to be 'B' and offer it into the queue*/
for (int i = -1; i < 2; i++) {
for (int j = -1; j < 2; j++) {
if (i == 0 && j == 0) {
continue;
}
int nextRow = currRow + i;
int nextCol = currCol + j;
if (nextRow >= m || nextRow < 0 || nextCol >= n || nextCol < 0) {
continue;
}
if (board[nextRow][nextCol] == 'E') {
/**we offer 'E' cells into the queue*/
queue.offer(new int[]{nextRow, nextCol});
/**then update this cell to be 'B' */
board[nextRow][nextCol] = 'B';
}
}
}
}
}
}
return board;
}
}
}