488. 祖玛游戏(回溯)

你正在参与祖玛游戏的一个变种。

在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'、黄色 'Y'、蓝色 'B'、绿色 'G' 或白色 'W' 。你的手中也有一些彩球。

你的目标是 清空 桌面上所有的球。每一回合:

从你手上的彩球中选出 任意一颗 ,然后将其插入桌面上那一排球中:两球之间或这一排球的任一端。
接着,如果有出现 三个或者三个以上 且 颜色相同 的球相连的话,就把它们移除掉。
如果这种移除操作同样导致出现三个或者三个以上且颜色相同的球相连,则可以继续移除这些球,直到不再满足移除条件。
如果桌面上所有球都被移除,则认为你赢得本场游戏。
重复这个过程,直到你赢了游戏或者手中没有更多的球。
给你一个字符串 board ,表示桌面上最开始的那排球。另给你一个字符串 hand ,表示手里的彩球。请你按上述操作步骤移除掉桌上所有球,计算并返回所需的 最少 球数。如果不能移除桌上所有的球,返回 -1 。


方法:没有什么好方法,只能暴力搜索,每一轮试着将手上任一球扔到图上任一位置,如果可以清空board,记录扔出球数,最后返回所有球数中的最小值

class Solution {int INF = 0x3f3f3f3f;String b;int m;Map<String, Integer> map = new HashMap<>();public int findMinStep(String a, String _b) {b = _b;m = b.length();int ans = dfs(a, 1 << m);return ans == INF ? -1 : ans;}int dfs(String a, int cur) {if (a.length() == 0) return 0;if (map.containsKey(a)) return map.get(a);int ans = INF;int n = a.length();for (int i = 0; i < m; i++) {if (((cur >> i) & 1) == 1) continue;int next = (1 << i) | cur;for (int j = 0; j <= n; j++) {boolean ok = false;if (j > 0 && j < n && a.charAt(j) == a.charAt(j - 1) && a.charAt(j - 1) != b.charAt(i)) ok = true;if (j < n && a.charAt(j) == b.charAt(i)) ok = true;if (!ok) continue;StringBuilder sb = new StringBuilder();sb.append(a.substring(0, j)).append(b.substring(i, i + 1));if (j != n) sb.append(a.substring(j));int k = j;while (0 <= k && k < sb.length()) {char c = sb.charAt(k);int l = k, r = k;while (l >= 0 && sb.charAt(l) == c) l--;while (r < sb.length() && sb.charAt(r) == c) r++;if (r - l - 1 >= 3) {sb.delete(l + 1, r);k = l >= 0 ? l : r; } else {break;}}ans = Math.min(ans, dfs(sb.toString(), next) + 1);}}map.put(a, ans);return ans;}
}

529. 扫雷游戏(DFS)

让我们一起来玩扫雷游戏!

给你一个大小为 m x n 二维字符矩阵 board ,表示扫雷游戏的盘面,其中:

'M' 代表一个 未挖出的 地雷,
'E' 代表一个 未挖出的 空方块,
'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的 已挖出的 空白方块,
数字('1' 到 '8')表示有多少地雷与这块 已挖出的 方块相邻,
'X' 则表示一个 已挖出的 地雷。
给你一个整数数组 click ,其中 click = [clickr, clickc] 表示在所有 未挖出的 方块('M' 或者 'E')中的下一个点击位置(clickr 是行下标,clickc 是列下标)。

根据以下规则,返回相应位置被点击后对应的盘面:

如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X' 。
如果一个 没有相邻地雷 的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的 未挖出 方块都应该被递归地揭露。
如果一个 至少与一个地雷相邻 的空方块('E')被挖出,修改它为数字('1' 到 '8' ),表示相邻地雷的数量。
如果在此次点击中,若无更多方块可被揭露,则返回盘面。

简单模拟,DFSBFS都可以,但我选择DFS

代码一:这段代码会爆栈,可以自己看看试试,找一找错误在哪里

class Solution {int[] dirX = {0, 1, 0, -1, 1, 1, -1, -1};int[] dirY = {1, 0, -1, 0, 1, -1, 1, -1};public char[][] updateBoard(char[][] board, int[] click) {int x = click[0], y = click[1];if (board[x][y] == 'M') {// 规则 1,点到雷改为X退出游戏board[x][y] = 'X';} else if (board[x][y] == 'E') {// 只有当点的是未被访问过的格子E才进入递归和判断dfs(board, x, y);}return board;}void dfs(char[][] board, int x, int y) {int cnt = 0;// 计算当前格子的八个方向里有几个雷for(int i=0;i<8;i++){int dx=x+dirX[i],dy=y+dirY[i];//考虑是否越界if(dx<0||dy<0||dx>=board.length||dy>=board[0].length)continue;if(board[dx][dy]=='M'){cnt++;}}//周边有雷,不能点开更多if(cnt!=0){board[x][y]=(char)('0'+cnt);}else{//中心位置无雷,遍历四周board[x][y]='B';for(int i=0;i<8;i++){int dx=x+dirX[i],dy=y+dirY[i];//是否越界(错误点)if(dx<0||dy<0||dx>=board.length||dy>=board[0].length)continue;dfs(board, dx, dy);}}return;}
}

错误的原因是dfs的时候,必须要考虑到目标点是否已经翻面,如果已经翻面就不再考虑,否则将会无限循环

代码改成这样即可,只处理未翻面的区域

            board[x][y]='B';for(int i=0;i<8;i++){int dx=x+dirX[i],dy=y+dirY[i];if(dx<0||dy<0||dx>=board.length||dy>=board[0].length)continue;if(board[dx][dy]=='E')dfs(board, dx, dy);}

LeetCodeDFS游戏-祖玛游戏扫雷游戏相关推荐

  1. C/C++基础讲解(九十一)之游戏篇(模拟扫雷游戏)

    C/C++基础讲解(九十一)之游戏篇(模拟扫雷游戏) 程序之美 前言 很多时候,特别是刚步入大学的学子们,对于刚刚开展的计算机课程基本上是一团迷雾,想要弄明白其中的奥秘,真的要花费一些功夫,我和大家一 ...

  2. c语言扫雷游戏代码_C语言游戏详解---扫雷游戏

    扫雷游戏大家应该都不陌生,一个扫雷游戏要满足的基本要求是: 1. 第一次扫的位置不能是雷 2. 每展开一个位置要显示该位置周围雷的个数 3. 若该位置周围没雷,要把周围展开 该游戏的界面是10X10的 ...

  3. Win11系统如何打开地雷游戏 Win11打开扫雷游戏的教程

    Win11系统如何打开地雷游戏?扫地雷游戏是一款很经典的游戏,很多人在休闲的时候都会在电脑中玩耍,不过有很多小伙伴刚升级到Win11系统,却不知道要如何打开地雷游戏,其实也不难找到,接下来可以跟着小编 ...

  4. 扫雷游戏软件测试,软件测试-扫雷游戏

    软件测试 实 验 报 告 20 15 20 16 学年第 2 学期 学 号 学生姓名 专业班级 学 院 学生成绩 1 1 引言引言 1 11 1 编写目的编写目的 编写该测试报告目的为 1 查找并总结 ...

  5. c语言扫雷游戏构成原理,扫雷游戏的C语言实现

    在学习C语言初期,我们可以找一些平常玩的游戏进行简单的C语言实现.今天就和大家分享一下关于windows中扫雷游戏的实现. 在正式写代码前,简单说一下对这个游戏的分析: 1.先提示的应该是一个简单的m ...

  6. python扫雷游戏设计_Python 扫雷游戏 完整源代码+图片素材

    设计需求 基础功能 实现windows扫雷游戏初级的全部功能 扫雷尺寸99 方格 每一个方格尺寸3030 游戏初始化时,随机分布10个地雷 当左键点击雷区任意方格时,则游戏开始 鼠标左键点击为翻开方格 ...

  7. 扫雷游戏软件测试,软件测试扫雷游戏.doc

    文档介绍: 软件测试扫雷游戏.DOCEvaluationWarning:ThedocumentwascreatedwithSpire..软件测试实验报告(2015-2016学年第丄学期)学号:学生姓名 ...

  8. 扫雷游戏软件测试,软件测试-扫雷游戏(10页)-原创力文档

    软件测试 实 验 报 告 (20 15 -20 16 学年第 2 学期) 学 号: 学生姓名: 专业班级: 学 院: 学生成绩: 1.引言 1.1 编写目的 编写该测试报告目的为: (1).查找并总结 ...

  9. python二维游戏示例_Python 扫雷游戏的简单例子

    使用python的tkinter做gui,由于没考虑可用性问题,因此UI比较难看,pygame更有趣更强大更好看,做这些小游戏更合适. python扫雷游戏的完整代码: 代码示例: #!/usr/bi ...

  10. python扫雷游戏设计_python扫雷游戏

    #-*- coding: utf-8 -*-#@Time : 2020/12/18 12:57#@Author : Zhenghui Lyu#@File : Main.py#@Software: Py ...

最新文章

  1. 2021年中国AIoT产业全景图谱
  2. php smarty 时间,smarty的时间格式-详细 | 时刻需
  3. 在eclipse中使用svn
  4. 我也做了B站UP主!
  5. 数据结构(C语言版)顺序栈相关算法的代码实现
  6. Hbuilderx编辑器介绍(00)
  7. 温暖守护美好生活,科技从不冷冰冰
  8. 洛谷——P1476 休息中的小呆
  9. eo是什么?一份没有满分的试题
  10. 廖雪峰Python 3.X 教程
  11. 【译】Jep 文档(2)——基本用法(Basic Usage)
  12. curl命令操作ElasticSearch
  13. 全域营销引领设计师职能进化
  14. GBase 8c技术特点
  15. c语言自定义创建文件,c语言自定义文件名?
  16. 【大众点评评论爬虫】一键获取大众点评完整评论工具批量爬取保存为excel数据
  17. Tampermonkey中文文档(部分)
  18. 第四章 证券投资基金的监管
  19. 参与IPFS项目最好的方式是买矿机挖Fil,而不是直接买币
  20. 魔兽世界台服显示无法连接服务器,魔兽世界台服服务器爆满 部分服务器已锁定 - 178魔兽世界专区...

热门文章

  1. 囧科技:用Office的老铁,扎心了
  2. Apple ID密保问题是个梗之重置密保成功终极方案
  3. java后端面试2021知识点大总结(超广范围全包含,随时更新)
  4. 最小二乘法,加权最小二乘法,迭代重加权最小二乘法 (含代码)【最小二乘线性求解】
  5. html表单 asp验证,ASP中JavaScript处理复杂表单的生成与验证
  6. NLP-D47-nlp比赛D16-读论文D8主动学习算法
  7. 总结下利用python赚钱的方法,在闲余时间月赚1000~5000不等...
  8. python cmdb 马哥_简易的CMDB服务端
  9. 0052-【科学可视】-纪录片-恐龙坑的秘密
  10. QQ校友农场辅助软件开发启动~(更新7.28)