LeetCode529. 扫雷游戏 Python3 DFS+BFS+注释
https://leetcode-cn.com/problems/minesweeper/solution/python3-dfsbfszhu-shi-by-xxd630/
规则:
- 'M' 代表一个未挖出的地雷
- 'X' 则表示一个已挖出的地雷。
- 'E' 代表一个未挖出的空方块,
- 'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,
- 数字('1' 到 '8')表示有多少地雷与这块已挖出的方块相邻,
边界条件:
- 现在给出在所有未挖出的方块中('M'或者'E')的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:
- 如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'。
- 如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的方块都应该被递归地揭露。
- 如果一个至少与一个地雷相邻的空方块('E')被挖出,修改它为数字('1'到'8'),表示相邻地雷的数量。
- 如果在此次点击中,若无更多方块可被揭露,则返回面板。
如果click是'M',那么就是踩雷了设定为X退出,返回棋盘。
如果不是分别进入DFS和BFS
- DFS首先设定边界条件如果不是‘E’return。剩下的就是和200岛屿问题一样进行DFS,只不过这里是八连通
class SolutionDFS:
def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:
if not board:
return []
m,n=len(board),len(board[0])
i,j=click[0],click[1]
if board[i][j] == 'M':
board[i][j] = 'X'
return board
self.dfs(board,i,j)
return board
def dfs(self,board,i,j):
if board[i][j] != 'E':
return
m,n=len(board),len(board[0])
directions = [(-1,-1), (0,-1), (1,-1), (1,0), (1,1), (0,1), (-1,1), (-1,0)]
mine_count = 0
for d in directions:
ni,nj=i+d[0],j+d[1]
if 0<=ni<m and 0<=nj<n and board[ni][nj]=='M':
mine_count+=1
if mine_count == 0:
board[i][j] = 'B'
else:
board[i][j] = str(mine_count)
return
for d in directions:
ni,nj=i+d[0],j+d[1]
if 0 <= ni <m and 0<=nj<n:
self.dfs(board,ni,nj)
- BFS:可以当做BFS模板的思路了没遍历过的放到queue标记board,完成后放到visited
class SolutionBFS:
def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:
m,n=len(board),len(board[0])
i,j=click[0],click[1]
if board[i][j] == "M":
board[i][j] = "X"
directions = [(-1,-1), (0,-1), (1,-1), (1,0), (1,1), (0,1), (-1,1), (-1,0)]
import collections
q = collections.deque()
q.append(click)
visited = set(click)
def numBombs(board,i,j):
mine_count = 0
for d in directions:
ni, nj = i + d[0], j + d[1]
if 0<=ni<m and 0<=nj<n and board[ni][nj] == 'M':
mine_count+=1
return mine_count
while q:
for _ in range(len(q)):
x,y=q.popleft()
if board[x][y] == 'E':
bombsNextTo = numBombs(board,x,y)
board[x][y] = "B" if bombsNextTo == 0 else str(bombsNextTo)
if bombsNextTo == 0:
for d in directions:
ni, nj = x + d[0], y + d[1]
if 0<=ni<m and 0<=nj<n and (ni,nj) not in visited:
q.append((ni,nj))
visited.add((ni,nj))
return board
LeetCode529. 扫雷游戏 Python3 DFS+BFS+注释的更多相关文章
- [Swift]LeetCode529. 扫雷游戏 | Minesweeper
Let's play the minesweeper game (Wikipedia, online game)! You are given a 2D char matrix representin ...
- Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)
Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...
- Java实现 LeetCode 529 扫雷游戏(DFS)
529. 扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线) ...
- 洛谷 P2670 扫雷游戏==Codevs 5129 扫雷游戏
题目描述 扫雷游戏是一款十分经典的单机小游戏.在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有 ...
- C#编写扫雷游戏
翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来.当然现在看来,里面有很多的不足之处,但因博主现在已经工作,没有时间再去优化.这个项目就是利用C#编写一个Windo ...
- FZU OJ 1056 :扫雷游戏
Problem 1056 扫雷游戏 Accept: 2624 Submit: 6903Time Limit: 1000 mSec Memory Limit : 32768 KB Prob ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- Leetcode 529.扫雷游戏
扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖 ...
- POJ2308连连看dfs+bfs+优化
DFS+BFS+MAP+剪枝 题意: 就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路: 首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...
随机推荐
- FIddler+Proxifer工具对windows PC客户端进行抓包
python的大火,带动了python爬虫. 爬虫就必定绕不开抓包. 目前最常见的就是网页抓包了,可以使用chrome进行,或者配合其他抓包软件 fiddler. 小程序有些兴起是,如跳一跳之类的,也 ...
- python_day05
今日内容 ''' post请求登录github Request URL: https://github.com/session Request Method: POST #Referer表示上一个请求 ...
- 在ensp上模拟企业网络场景并Access接口加入相应VLAN
模拟的企业网络大概描述: 公司内网是一个大的局域网,二层交换机S1放置在一楼,在一楼办公的部门有IT部和人事部:二层交换机S2放置在二楼,在二楼办公的部门有市场部和研发部.由于交换机组成的是广播网,交 ...
- [折腾笔记] 洛谷P1149-火柴棒等式 AC记
原题链接: https://www.luogu.org/problem/P1149 题面简述: 给你n根火柴棍,你可以拼出多少个形如"A+B=C""A+B=C" ...
- 《手把手教你》系列练习篇之6-python+ selenium自动化测试(详细教程)
1. 简介 前面文章我们了解了如何获取元素的text属性值,和判断元素是否显示在页面(is_displayed()方法),本文我们来学习下,判断一个控件是否被选中状态. 2. 验证控件是否被选中 还是 ...
- Zookeeper 应用实现-配置中心
一.目标 一个乞丐版自更新配置中心,更新配置后,能在各个服务器实现更新 二.架构 三.角色 config-web: 配置后台,主要用于管理配置,增改配置 config-agent: 监听配置,遇到变动 ...
- php 精度计算问题
PHP var_dump(intval(0.58 * 100)); 正确结果是 57,而不是 58 浮点运算惹的祸 其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 N ...
- c# 窗体开发2 高级控件的使用
1.单选按钮(RadioButton) 同一组中其他单选按钮不能同时选定 分组形式:panel GoupBox 窗体 方法: 属性 说明 Appearance RadioButton 控件的显示与命令 ...
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- Jest测试框架入门
近年来,随着前端工程化的发展,前端发生了翻天覆地的变化.jQuery已经慢慢淡出了我们的视野,React.Vue和anglur三驾马车急速驶来.从此,前端进入了数据驱动的时代,也有了清晰的模块化开发的 ...