洛谷P2670-扫雷游戏

本文详细解析了NOIP2015扫雷游戏的解题思路,分为初始化和状态转换两部分。状态转换中提到的暴力for循环和洪水覆盖优化策略。通过优化,减少了循环次数,提高了算法效率。
摘要由CSDN通过智能技术生成

原题链接:P2670 [NOIP2015 普及组] 扫雷游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P2670

思路分析:

        我们将这道题分为两个部分:

初始化:

        实际上初始化这部分很简单--定义二维数组,然后循环即可(代码中使用Map和map数组)

代码如下:

状态转换(外加更新)

       这部分实际上也很简单:

先说转移:

        双重for循环会"自动"转移(严格意义来说,更像是移动,只不过是每次向某一行的右侧移动一格)

再说更新:

        如果是"地雷"格,则保留原状态(也就是"*");

        但如果是"安全"格,就要统计周围8个格子的"状态"--也就是每一个炸弹,该"安全"格的数值要加"1"(为了更加简单,你完全可以定义两个char类型的数组)

       总结下来--暴力for循环就可以解决一切(暴力是世界上最好的算法思想) 

代码如下:

组装一下,就可以得到我们想要的结果:

        

代码优化:

        对于这道题目来说,暴力for循环就可以达到"AC"的目的,但实际上我们可以在状态转移的时候做一点优化。

        实际上是这样的--在通过暴力方法时,每次我们只能去更新一个格子的状态--实际上,我们可以一次性"统计"中心格周围八个格子

        说到这里你可能会联想到另一种算法思想--没错,就是"洪水覆盖"--也就是我们一次性向周围四个(上下左右四个方向;甚至可以是八个)进行拓展,并将该四个格子记为"已更新"(在更新过程中,我们可以跳过标记为"已更新"状态的格子,来达到log4N,甚至是log8N的效果

        但这样的操作也有缺点--我们需要额外创建数组--"状态数组(记录当前是否格子是否已经被访问过)",以及"转移数组(下一次要向哪里移动)"

代码如下:

ps:这里我们使用bool类型数组judge来记录各个格子是否已经被"检查过"

       

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值