Problem Description:

扫雷这个游戏想必各位都是会玩的吧。简单说一下规则,n行m列的格子地图上有分布一些雷。起先每个格子
都是未点开的状态,我们依次点开格子,找出所有雷。有如下3条规则:
1.点开的地方如果相邻的格子(上、下、左、右,左上、左下、右上、右下)有雷,该格子显示一个数字,表
示该格子相邻的地方有几个雷(最多8)。
2.如果点开的地方是雷,则游戏结束。
3.如果点开的地方和相邻的地方都没雷,就自动向外扩张到相邻有雷的地方。
ps:没玩过扫雷不能理解上面说的可以开一下系统自带扫雷试试。不过我觉得我语言表达能力还是可以的,
你们应该能看懂。
给出一副n行m列的地图,'*'号表示雷。'.'表示非雷。
写一个程序找出,最少需要点几下就能找出所有的雷。

Input:

输入包含多组测试,每组测试是一个n行m列的地图(0<n,m<=100),地图只包含'*'或'.'。

Output:

对于每组测试,输出最少需要点几下就能找出所有的雷。

Sample Input:

5 5
...**
**.**
*****
.....
*.*.*

Sample Output:

11
解题思路:算是对扫雷的规则有了深刻的认识,典型的dfs。思路:如果点击的某个位置(x,y)是空白并且周围(八个方向)都没有雷,那么就会沿着周围按这个规则递归扩展空白,扩展过程中若遇到某个周围有雷的位置,则不再递归扩展,直接显示出该位置上的数字即可。于是我们先dfs扩展那些能扩展的位置,然后再单独点一下剩下那些有数字的位置即可。显然,这样的点击次数是最少的。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=;
int n,m,ans,dir[][]={{-,-},{-,},{,-},{,},{-,},{,},{,-},{,}};
char mp[maxn][maxn];bool vis[maxn][maxn];
bool is_border(int x,int y){///判断是否越界
if(x>=&&x<n&&y>=&&y<m)return true;
return false;
}
bool check(int x,int y){///检查点(x,y)周围是否都不是雷
for(int i=;i<;++i){
int nx=x+dir[i][],ny=y+dir[i][];
if(is_border(nx,ny)&&mp[nx][ny]=='*')return false;
}
return true;
}
void dfs(int x,int y){///不必考虑mp[x][y]=='*',因为递归前已都将是雷的排除在外,但是已经访问的要返回,减少递归次数
if(vis[x][y])return;///已访问则直接返回
vis[x][y]=true;
for(int i=;i<;++i){
int nx=x+dir[i][],ny=y+dir[i][];
if(is_border(nx,ny)&&!vis[nx][ny]&&mp[nx][ny]=='.'){
if(check(nx,ny))dfs(nx,ny);///周围没有雷,则继续dfs扩展能到达的地方
else vis[nx][ny]=true;///否则直接标记为T,表示最多只能扩充到当前位置
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(vis,false,sizeof(vis));ans=;
for(int i=;i<n;++i)scanf("%s",mp[i]);
for(int i=;i<n;++i)
for(int j=;j<m;++j)
if(!vis[i][j]&&mp[i][j]=='.'&&check(i,j))dfs(i,j),ans++;///先递归扩展空白处
for(int i=;i<n;++i)
for(int j=;j<m;++j)
if(!vis[i][j]&&mp[i][j]=='.')ans++;///再将未访问点一下即可
printf("%d\n",ans);
}
return ;
}
 

ACM_扫雷(dfs)的更多相关文章

  1. 牛客~~扫雷~~~DFS+模拟

    链接:https://www.nowcoder.com/acm/contest/118/F来源:牛客网 题目描述 <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间 ...

  2. 接雨水12 · Trapping Rain Water12

    [抄题]: Given n non-negative integers representing an elevation map where the width of each bar is 1, ...

  3. HDU 5965 扫雷(dfs)题解

    题意:给你一个3*n的格子,中间那行表明的是周围8格(当然左右都没有)的炸弹数量,上下两行都可以放炸弹,问你有几种可能,对mod取模 思路:显然(不),当i - 1和i - 2确定时,那么i的个数一定 ...

  4. ACM_素数环(dfs)

    Problem Description: 如图所示,环由n个圆组成. 将自然数1,2,...,n分别放入每个圆中,并且两个相邻圆中的数字总和应为素数. 注意:第一个圆圈的数量应该始终为1. Input ...

  5. LeetCode529. 扫雷游戏 Python3 DFS+BFS+注释

    https://leetcode-cn.com/problems/minesweeper/solution/python3-dfsbfszhu-shi-by-xxd630/ 规则: 'M' 代表一个未 ...

  6. Java实现 LeetCode 529 扫雷游戏(DFS)

    529. 扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线) ...

  7. Java课程设计——扫雷(winmine)

    因为是我的课程设计,要是有冲突就不好了,转载注明出处!!! 程序很简单,毕竟我是搞acm的,我就只介绍一下闪光点. 中心空白搜索的时候,我用的DFS: 有一点是要注意的,就是JFrame不支持重画,还 ...

  8. hiho #1114 : 小Hi小Ho的惊天大作战:扫雷·一

    #1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 故事背景:密室.监视器与充满危机的广场 “我们还是循序渐进,先来考虑这 ...

  9. 洛谷 P2670 扫雷游戏==Codevs 5129 扫雷游戏

    题目描述 扫雷游戏是一款十分经典的单机小游戏.在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有 ...

随机推荐

  1. solr单机多实例部署文件锁冲突解决的方法

    给出一个有问题的单机多tomcat实例引用同一个solr实例部署图. 这样的部署必定造成一个问题.启动第二个tomcat实例时,一定会报索引目录文件锁已经被占用. 最初的解决的方法是.有多少个tomc ...

  2. POJ 2750 Potted Flower(线段树+dp)

    题目链接 虽然是看的别的人思路,但是做出来还是挺高兴的. 首先求环上最大字段和,而且不能是含有全部元素.本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄.实际可以求出最小值,总和-最小,就 ...

  3. quilt

    1 什么是quilt quilt是一个patch管理工具,特别适合于对多个patch进行管理. quilt是基于gnu patch和diff的. 2 使用quilt创建一个patch 第一步,quil ...

  4. org.gradle.api.publication.maven.internal.DefaultMavenFactory错误

    Error:Unable to load class 'org.gradle.api.publication.maven.internal.DefaultMavenFactory'. Possible ...

  5. $.ajax 使用详解

    Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作. $.post.$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到jQuery.ajax() ...

  6. Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】

    使用WebClient读取XAP包同目录下的XML文件 我们想要读取XAP包下面的XML文件,需要将此XML文件放在加载XAP包的网页的目录中去,然后使用URI方式读取此URL方式下的XML文件. 首 ...

  7. bzoj 2301 [HAOI2011]Problem b(莫比乌斯反演+分块优化)

    题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 1≤n≤50000,1≤a≤b≤50000, ...

  8. Quartz2D绘图 及实例:下载进度

    基础绘图: C语言coregraphics框架   绘制一条线:(不常用) UIBezierPath 路径画图 1.线段 线段2: 2.三角形 填充颜色 如果边框颜色和填充颜色都为红色:[[UICol ...

  9. [Selenium] common functions comparison

    1.Wait for element  in default time or self defined time When the element need some time to be prese ...

  10. Dijkstra再理解+最短路计数

    众所周知,Dijkstra算法是跑单源最短路的一种优秀算法,不过他的缺点在于难以处理负权边. 但是由于在今年的NOI赛场上SPFA那啥了(嗯就是那啥了),所以我们还是好好研究一下Dij的原理和它的优化 ...