1. 程式人生 > >Leetcode 529.掃雷遊戲

Leetcode 529.掃雷遊戲

oid 輸出 規則 length 情況 矩陣 str 註意 http

掃雷遊戲

讓我們一起來玩掃雷遊戲!

給定一個代表遊戲板的二維字符矩陣。 ‘M‘ 代表一個未挖出的地雷,‘E‘ 代表一個未挖出的空方塊,‘B‘ 代表沒有相鄰(上,下,左,右,和所有4個對角線)地雷的已挖出的空白方塊,數字(‘1‘ 到 ‘8‘)表示有多少地雷與這塊已挖出的方塊相鄰,‘X‘ 則表示一個已挖出的地雷。

現在給出在所有未挖出的方塊中(‘M‘或者‘E‘)的下一個點擊位置(行和列索引),根據以下規則,返回相應位置被點擊後對應的面板:

  1. 如果一個地雷(‘M‘)被挖出,遊戲就結束了- 把它改為 ‘X‘
  2. 如果一個沒有相鄰地雷的空方塊(‘E‘)被挖出,修改它為(‘B‘),並且所有和其相鄰的方塊都應該被遞歸地揭露。
  3. 如果一個至少與一個地雷相鄰的空方塊(‘E‘)被挖出,修改它為數字(‘1‘到‘8‘),表示相鄰地雷的數量。
  4. 如果在此次點擊中,若無更多方塊可被揭露,則返回面板。

示例 1:

輸入:

[[‘E‘, ‘E‘, ‘E‘, ‘E‘, ‘E‘],

[‘E‘, ‘E‘, ‘M‘, ‘E‘, ‘E‘],

[‘E‘, ‘E‘, ‘E‘, ‘E‘, ‘E‘],

[‘E‘, ‘E‘, ‘E‘, ‘E‘, ‘E‘]]

Click : [3,0]

輸出:

[[‘B‘, ‘1‘, ‘E‘, ‘1‘, ‘B‘],

[‘B‘, ‘1‘, ‘M‘, ‘1‘, ‘B‘],

[‘B‘, ‘1‘, ‘1‘, ‘1‘, ‘B‘],

[‘B‘, ‘B‘, ‘B‘, ‘B‘, ‘B‘]]

解釋:

技術分享圖片

示例 2:

輸入:

[[‘B‘, ‘1‘, ‘E‘, ‘1‘, ‘B‘],

[‘B‘, ‘1‘, ‘M‘, ‘1‘, ‘B‘],

[‘B‘, ‘1‘, ‘1‘, ‘1‘, ‘B‘],

[‘B‘, ‘B‘, ‘B‘, ‘B‘, ‘B‘]]

Click : [1,2]

輸出:

[[‘B‘, ‘1‘, ‘E‘, ‘1‘, ‘B‘],

[‘B‘, ‘1‘, ‘X‘, ‘1‘, ‘B‘],

[‘B‘, ‘1‘, ‘1‘, ‘1‘, ‘B‘],

[‘B‘, ‘B‘, ‘B‘, ‘B‘, ‘B‘]]

解釋:

技術分享圖片

註意:

  1. 輸入矩陣的寬和高的範圍為 [1,50]。
  2. 點擊的位置只能是未被挖出的方塊 (‘M‘ 或者 ‘E‘),這也意味著面板至少包含一個可點擊的方塊。
  3. 輸入面板不會是遊戲結束的狀態(即有地雷已被挖出)。
  4. 簡單起見,未提及的規則在這個問題中可被忽略。例如,當遊戲結束時你不需要挖出所有地雷,考慮所有你可能贏得遊戲或標記方塊的情況。

技術分享圖片

思路

BFS,不能一直深搜,因為當前位置如果要顯示數字(即周圍有幾個雷),那麽不能對它的四周進行深搜。

因此先count當前四周雷數,如果沒有雷才能繼續遞歸搜索

 1 public class Solution {
 2     int[][] dirs = {{1, 0}, {1, 1}, {1, -1}, {-1, 0}, {-1, 1}, {-1, -1}, {0, 1}, {0, -1}};
 3     public char[][] updateBoard(char[][] board, int[] click) {
 4         if (board == null || board.length == 0) {
 5             return board;
 6         }
 7         int i = click[0];
 8         int j = click[1];
 9         if (board[i][j] == ‘M‘) {
10             board[i][j] = ‘X‘;
11             return board;
12         }
13         update(board, i, j);
14         return board;
15     }
16     private void update(char[][] board, int i, int j) {
17         if (board[i][j] != ‘E‘) {
18             return;
19         }
20         int cnt = 0;
21         for (int[] dir : dirs) {
22             int row = dir[0] + i;
23             int col = dir[1] + j;
24             if (row >= 0 && row < board.length && col >= 0 && col < board[0].length && board[row][col] == ‘M‘) {
25                 cnt++;
26             }
27         }
28         board[i][j] = ‘*‘;
29         if (cnt == 0) {
30             board[i][j] = ‘B‘;
31             for (int[] dir : dirs) {
32                 int row = dir[0] + i;
33                 int col = dir[1] + j;
34                 if (row >= 0 && row < board.length && col >= 0 && col < board[0].length) {
35                     update(board, row, col);
36                 }
37             }
38         } else {
39             board[i][j] = (char) (cnt + ‘0‘);
40         }
41     }
42 }

Leetcode 529.掃雷遊戲