ACM_扫雷(dfs)
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)的更多相关文章
- 牛客~~扫雷~~~DFS+模拟
		
链接:https://www.nowcoder.com/acm/contest/118/F来源:牛客网 题目描述 <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间 ...
 - 接雨水12 · Trapping Rain Water12
		
[抄题]: Given n non-negative integers representing an elevation map where the width of each bar is 1, ...
 - HDU 5965 扫雷(dfs)题解
		
题意:给你一个3*n的格子,中间那行表明的是周围8格(当然左右都没有)的炸弹数量,上下两行都可以放炸弹,问你有几种可能,对mod取模 思路:显然(不),当i - 1和i - 2确定时,那么i的个数一定 ...
 - ACM_素数环(dfs)
		
Problem Description: 如图所示,环由n个圆组成. 将自然数1,2,...,n分别放入每个圆中,并且两个相邻圆中的数字总和应为素数. 注意:第一个圆圈的数量应该始终为1. Input ...
 - LeetCode529. 扫雷游戏 Python3 DFS+BFS+注释
		
https://leetcode-cn.com/problems/minesweeper/solution/python3-dfsbfszhu-shi-by-xxd630/ 规则: 'M' 代表一个未 ...
 - Java实现 LeetCode 529 扫雷游戏(DFS)
		
529. 扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线) ...
 - Java课程设计——扫雷(winmine)
		
因为是我的课程设计,要是有冲突就不好了,转载注明出处!!! 程序很简单,毕竟我是搞acm的,我就只介绍一下闪光点. 中心空白搜索的时候,我用的DFS: 有一点是要注意的,就是JFrame不支持重画,还 ...
 - hiho #1114 : 小Hi小Ho的惊天大作战:扫雷·一
		
#1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 故事背景:密室.监视器与充满危机的广场 “我们还是循序渐进,先来考虑这 ...
 - 洛谷  P2670 扫雷游戏==Codevs 5129 扫雷游戏
		
题目描述 扫雷游戏是一款十分经典的单机小游戏.在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有 ...
 
随机推荐
- spring MVC (学习笔记)
			
web.xml 相关配置 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns=" ...
 - Lambda Architecture
			
Lambda Architecture » λ lambda-architecture.net http://lambda-architecture.net/ Twitter's tweets ana ...
 - spark mongo 性能优化
			
性能优化事项 http://www.mongoing.com/wp-content/uploads/2016/08/MDBSH2016/TJ_MongoDB+Spark.pdf MongoDB + S ...
 - JS简单正则得到字符串中特定的值
			
这里就直接看演示样例吧.演示样例的目的是为了获取 a 字符串中的 c02806015 <script language="javascript"> var a = '礼 ...
 - (30)java web的hibernate使用-c3p0连接池配置
			
hibernate支持c3p0连接池 需要导入c3p0的jar包 <!-- 配置连接驱动管理类 --> <property name="hibernate.connecti ...
 - java 相关博客
			
Intellij Idea 创建Web项目入门(一) SpringMVC 和 MyBatis 学习笔记,搭配示例,主要讲解一些基础的概念.用法和配置 包含框架有:SpringMVC.MyBaits.A ...
 - button在firefox 和 ie 下的问题
			
最近做了一个关于数据库管理的项目,因为不用考虑ie9以下的兼容性,所以一股脑的写完啦,到测试的时候发现了一个bug IE和火狐下有个模块关闭按钮的hover没有反应,ie不行就算了,火狐怎么也不行?我 ...
 - 初探linux子系统集之led子系统(一)【转】
			
本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37569789 就像学编程第一个范例helloworld一样,学嵌入式,单片机.f ...
 - nginx、mysql、php等各编译参数查询
			
查看nginx编译参数:/usr/local/nginx/sbin/nginx -V 查看apache编译参数:cat /usr/local/apache2/build/config.nice 查看m ...
 - JQuery判断div(控件)是否为隐藏
			
以下是JavaScript 中判断div是否为隐藏代码引用片段: if (div.style.display == "none") { div.style.display = &q ...