讓我們一起來玩掃雷游戲!
給定一個代表游戲板的二維字符矩陣。 ‘M’ 代表一個未挖出的地雷,‘E’ 代表一個未挖出的空方塊,‘B’ 代表沒有相鄰(上,下,左,右,和所有4個對角線)地雷的已挖出的空白方塊,數字(‘1’ 到 ‘8’)表示有多少地雷與這塊已挖出的方塊相鄰,‘X’ 則表示一個已挖出的地雷。
現在給出在所有未挖出的方塊中(‘M’或者’E’)的下一個點擊位置(行和列索引),根據以下規則,返回相應位置被點擊后對應的面板:
如果一個地雷(‘M’)被挖出,游戲就結束了- 把它改為 ‘X’。
如果一個沒有相鄰地雷的空方塊(‘E’)被挖出,修改它為(‘B’),并且所有和其相鄰的方塊都應該被遞歸地揭露。
如果一個至少與一個地雷相鄰的空方塊(‘E’)被挖出,修改它為數字(‘1’到’8’),表示相鄰地雷的數量。
如果在此次點擊中,若無更多方塊可被揭露,則返回面板。
示例 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’]]
代碼
class Solution {public char[][] updateBoard(char[][] board, int[] click) {int[][] dir=new int[][]{{-1,0},{1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};if(board[click[0]][click[1]]=='M')board[click[0]][click[1]]='X';else if(board[click[0]][click[1]]=='E')update(board,click[0],click[1],dir);return board;}public void update(char[][] board, int x,int y,int[][] dir) {int sum=0;for(int[] d:dir)//檢查周圍有沒有地雷{int nextX=d[0]+x,nextY=d[1]+y;if(nextX<0||nextY>=board[0].length||nextY<0||nextX>=board.length) continue;if(board[nextX][nextY]=='M') sum++;}if(sum==0) board[x][y]='B';else {//有地雷就停止遍歷并且改變boardboard[x][y]=(char)( sum+'0');return;}for(int[] d:dir)//繼續遍歷可能的路徑{int nextX=d[0]+x,nextY=d[1]+y;if(nextX<0||nextY>=board[0].length||nextY<0||nextX>=board.length||board[nextX][nextY]!='E') continue;update(board, nextX, nextY, dir);}}
}