日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

529. Minesweeper

發(fā)布時(shí)間:2024/5/7 编程问答 100 豆豆
生活随笔 收集整理的這篇文章主要介紹了 529. Minesweeper 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

讓我們一起來(lái)玩掃雷游戲!

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

現(xiàn)在給出在所有未挖出的方塊中('M'或者'E')的下一個(gè)點(diǎn)擊位置(行和列索引),根據(jù)以下規(guī)則,返回相應(yīng)位置被點(diǎn)擊后對(duì)應(yīng)的面板:

  • 如果一個(gè)地雷('M')被挖出,游戲就結(jié)束了- 把它改為?'X'
  • 如果一個(gè)沒(méi)有相鄰地雷的空方塊('E')被挖出,修改它為('B'),并且所有和其相鄰的未挖出方塊都應(yīng)該被遞歸地揭露。
  • 如果一個(gè)至少與一個(gè)地雷相鄰的空方塊('E')被挖出,修改它為數(shù)字('1'到'8'),表示相鄰地雷的數(shù)量。
  • 如果在此次點(diǎn)擊中,若無(wú)更多方塊可被揭露,則返回面板。
  • ?

    示例 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]。
  • 點(diǎn)擊的位置只能是未被挖出的方塊 ('M' 或者 'E'),這也意味著面板至少包含一個(gè)可點(diǎn)擊的方塊。
  • 輸入面板不會(huì)是游戲結(jié)束的狀態(tài)(即有地雷已被挖出)。
  • 簡(jiǎn)單起見(jiàn),未提及的規(guī)則在這個(gè)問(wèn)題中可被忽略。例如,當(dāng)游戲結(jié)束時(shí)你不需要挖出所有地雷,考慮所有你可能贏得游戲或標(biāo)記方塊的情況。
  • DFS

    類似于迷宮問(wèn)題,首先想到深度優(yōu)先搜索。

  • 當(dāng)前點(diǎn)擊的是「未挖出的地雷」,我們將其值改為 X\text{X}X 即可。
  • 當(dāng)前點(diǎn)擊的是「未挖出的空方塊」,我們需要統(tǒng)計(jì)它周圍相鄰的方塊里地雷的數(shù)量 cnt\textit{cnt}cnt(即 M\text{M}M 的數(shù)量)。如果 cnt\textit{cnt}cnt 為零,即執(zhí)行規(guī)則 222,此時(shí)需要將其改為 B\text{B}B,且遞歸地處理周圍的八個(gè)未挖出的方塊,遞歸終止條件即為規(guī)則 444,沒(méi)有更多方塊可被揭露的時(shí)候。否則執(zhí)行規(guī)則 333,將其修改為數(shù)字即可。
  • Code

    def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:dirs = [(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]def dfs(x, y):cnt = 0for dx, dy in dirs:nx, ny = x + dx, y + dyif not (nx < 0 or ny < 0 or nx >= len(board) or ny >= len(board[0])):cnt += board[nx][ny] == 'M'if cnt > 0:board[x][y] = str(cnt)else:board[x][y] = 'B'for dx, dy in dirs:nx, ny = x + dx, y + dyif not (nx < 0 or ny < 0 or nx >= len(board) or ny >= len(board[0]) or board[nx][ny] != 'E'):dfs(nx, ny)if board[click[0]][click[1]] == 'M':board[click[0]][click[1]] = 'X'else:dfs(click[0], click[1])return board

    復(fù)雜度分析

    • 時(shí)間復(fù)雜度:O(nm)O(nm)O(nm),其中 nnnmmm 分別代表面板的寬和高。最壞情況下會(huì)遍歷整個(gè)面板。
    • 空間復(fù)雜度:O(nm)O(nm)O(nm)。空間復(fù)雜度取決于遞歸的棧深度,而遞歸棧深度在最壞情況下有可能遍歷整個(gè)面板而達(dá)到 O(nm)O(nm)O(nm)

    總結(jié)

    以上是生活随笔為你收集整理的529. Minesweeper的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。