leetcode_529. 扫雷游戏 python
目錄
一、題目內容
二、解題思路
三、代碼?
一、題目內容
讓我們一起來玩掃雷游戲!
給定一個代表游戲板的二維字符矩陣。?'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']]
解釋:
示例 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,50]。
點擊的位置只能是未被挖出的方塊 ('M' 或者 'E'),這也意味著面板至少包含一個可點擊的方塊。
輸入面板不會是游戲結束的狀態(即有地雷已被挖出)。
簡單起見,未提及的規則在這個問題中可被忽略。例如,當游戲結束時你不需要挖出所有地雷,考慮所有你可能贏得游戲或標記方塊的情況。
二、解題思路
1.點擊的鄰近八個方向需要查找是否有地雷M,有則改為地雷數目(1-8)。
2.若鄰近的八個方向都沒有地雷,則改為B,且遞歸查找八個方向的八個方向是否有地雷。
3.若直接點擊為地雷M,則改為X。
三、代碼?
class Solution(object):def updateBoard(self, board, click):""":type board: List[List[str]]:type click: List[int]:rtype: List[List[str]]"""L = len(board)W = len(board[0])x = click[0]y = click[1]if board[x][y] == "M":board[x][y] = "X"return boarddef dfs(x, y):if x < 0 or x >= L or y < 0 or y >= W or board[x][y] not in "EM":returnif board[x][y] == "M":returnelif board[x][y] == "E":count = 0# leftif x - 1 >= 0 and x - 1 < L and y >= 0 and y < W and board[x - 1][y] == "M":count += 1# rightif x + 1 >= 0 and x + 1 < L and y >= 0 and y < W and board[x + 1][y] == "M":count += 1# downif x >= 0 and x < L and y - 1 >= 0 and y - 1 < W and board[x][y - 1] == "M":count += 1# upif x >= 0 and x < L and y + 1 >= 0 and y + 1 < W and board[x][y + 1] == "M":count += 1# left downif x - 1 >= 0 and x - 1 < L and y - 1 >= 0 and y - 1 < W and board[x - 1][y - 1] == "M":count += 1# right downif x + 1 >= 0 and x + 1 < L and y - 1 >= 0 and y - 1 < W and board[x + 1][y - 1] == "M":count += 1# left upif x - 1 >= 0 and x - 1 < L and y + 1 >= 0 and y + 1 < W and board[x - 1][y + 1] == "M":count += 1# right upif x + 1 >= 0 and x + 1 < L and y + 1 >= 0 and y + 1 < W and board[x + 1][y + 1] == "M":count += 1if count == 0:board[x][y] = "B"dfs(x - 1, y)dfs(x + 1, y)dfs(x, y - 1)dfs(x, y + 1)dfs(x - 1, y - 1)dfs(x + 1, y - 1)dfs(x - 1, y + 1)dfs(x + 1, y + 1)else:board[x][y] = str(count)dfs(x, y)return boardif __name__ == '__main__':board = [["E","E","E","E","E"],["E","E","M","E","E"],["E","E","E","E","E"],["E","E","E","E","E"]]click = [3, 0]s = Solution()ans = s.updateBoard(board, click)print(ans)總結
以上是生活随笔為你收集整理的leetcode_529. 扫雷游戏 python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基桩静荷载测试数据分析软件,静荷载基桩检
- 下一篇: PHPMailer 使用方法(支持群发)