529. 扫雷游戏

让我们一起来玩扫雷游戏!
给定一个代表游戏板的二维字符矩阵。 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字('1' 到 '8')表示有多少地雷与这块已挖出的方块相邻,'X' 则表示一个已挖出的地雷。
现在给出在所有未挖出的方块中('M'或者'E')的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:
如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'。
如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的方块都应该被递归地揭露。
如果一个至少与一个地雷相邻的空方块('E')被挖出,修改它为数字('1'到'8'),表示相邻地雷的数量。
如果在此次点击中,若无更多方块可被揭露,则返回面板。

解题思路

深度优先。在周围没有地雷的方格中使用递归。走周围八个方向,一旦遇到数字or地雷就停止

class Solution:
    def updateBoard(self, board, click):
        if board[click[0]][click[1]]=='M':
            board[click[0]][click[1]]='X'
            return board 
        elif board[click[0]][click[1]]=='E':
            # 设定当前点周围的八个点
            e_cords = [[-1, -1], [-1, 0], [-1, 1],
                        [0, -1], [0, 1], 
                        [1, -1], [1, 0], [1, 1]]

            # 保存已经遍历过的点 
            # visited = set()
            visited = []
            def dfs(x, y):
                # 走八个方向,一旦遇到数字或地雷就停止
                for i in range(8):
                    # 得到当前点周围的八个点,但是这八个点要求在有效范围内
                    new_x , new_y = x + e_cords[i][0], y + e_cords[i][1]
                    if -1<new_x<len(board) and -1<new_y<len(board[0]):
                        if board[new_x][new_y]=='E' and (new_x, new_y) not in visited:
                            visited.append((new_x, new_y))
                            # print(visited)
                            r = judgenNum(new_x, new_y)
                            if r:
                                # 如果有数字的话搜素停止
                                board[new_x][new_y] = str(r)
                            else:
                                # 否则进行递归
                                board[new_x][new_y] = 'B'
                                dfs(new_x, new_y)
            # 判断是否需要修改成数字,如果周围有M,则数字加一
            def judgenNum(x, y):
                res = 0 
                for i in range(8):
                    new_x , new_y = x + e_cords[i][0], y + e_cords[i][1]
                    if -1<new_x<len(board) and -1<new_y<len(board[0]):
                        if board[new_x][new_y]=='M':
                            res += 1 
                return res 

            x, y = click[0], click[1]
            r = judgenNum(x, y)
            if r:
                board[x][y] = str(r)

            else:
                board[x][y] = 'B'
                dfs(x, y)

        return board

你可能感兴趣的:(leetcode,数据结构)