18清明校内测试T3
扫雷(mine)
Time Limit:1000ms Memory Limit:128MB
题目描述
rsy最近沉迷于一款叫扫雷的游戏。
这个游戏是这样的。一开始网格上有n*m个位置,其中有一些位置有雷。每次rsy可以左键点击一个方块,此时若这个方块是雷,则rsy被炸,游戏结束,否则如果这个位置周围8格有x个雷,则会显示数字x。特别地,当x=0时,系统会自动左键点击附近8个位置。(此时附近8个位置一定没有雷,假如附近8个位置仍存在x=0,则继续往外扩展)想要更进一步获得关于题目的信息,打开程序->附近->游戏->扫雷或者直接打开下发的可执行文件。
或者rsy右键点击一个位置,标注这个位置是雷。
不幸的是,她鼠标不能左右键同时点击,因此只需考虑她左键点击与右键点击就可以了。
注意游戏胜利的条件是所有非雷的位置都被左键点击到。(特别地,当一开始时n*m个位置都是雷时,LYK自动获得胜利)
rsy从网上下载了金手指,很轻易地就掌握了所有雷所在的位置。rsy想通过最少的点击次数获得胜利(这里的点击次数不包括系统自动点击)。于是他来请求你的帮助。
输入格式(mine.in)
第一行两个数n,m。
接下来n行,每行m个数ai,j,表示这个矩阵。若ai,j=’*’则表示这个位置是雷,若ai,j=’.’则表示不是雷。
输出格式(mine.out)
一个数表示答案。
输入样例
3 3
..*
...
..*
输出样例
2
对于30%的数据n=1;
对于另外20%的数据n,m<=3;
对于再另外20%的数据*大致占矩阵的2/3且数据随机。
对于100%的数据n,m<=1000。
Hint:
适度游戏益脑,沉迷游戏伤身。
因为数据范围并不是很大,所以带优化的搜索应该能过。
于是乎开始敲代码。
但是写着写着发现一个问题,如果一个非雷的点的八个方向上有雷,但是通过鼠标右键将它标记之后,如果在点这个非雷的点,是否会出现系统自动点击周围的点。我在这里纠结了很长时间,到最后让老师用std跑了一组数据就知道根本不用考虑这么多。
就是下面这组
3 3
...
..*
...
至于为什么自己想吧。
下面来看看正解。没错就是搜索。
我们来设计一下BFS做这道题,首先应该把每个点周围的雷的数量存在一个数组中去,然后每一个点都判断一下,如果这个点周围没有雷,并且这里不是雷而且没有被访问过,那就可以就从这里向外扩展,不过要记得在BFS之前就将要进行扩展的点标记为访问。就可以了。
扩展的时候把这个这个点周围的点全部标记,如果被标记的点内存在周围没有雷的点,就把这个点扔到队列里去。继续扩展
整张地图全扩展完了之后,还要判断一下有没有落单的点,有的话,就ans++
代码
#include <iostream>
#include <cstdio>
#include <queue> using namespace std; int n, m, ans;
char map[][];
int dx[] = {, -, , , , -, , -};
int dy[] = {, , , -, -, , , -};
struct node {
int x, y;
};
bool vis[][];
int num[][];
queue<node> P; void bfs(node now) {
while(!P.empty()) {
now = P.front();
P.pop();
int x = now.x, y = now.y;
for(int k=; k<; k++) {
int xx = dx[k]+x, yy = dy[k]+y;
if(xx <= n&&xx > &&yy <= m&&yy > &&map[xx][yy] == '.'&&vis[xx][yy] == ) {
vis[xx][yy] = ;
if(num[xx][yy] == ) {
P.push((node) {xx, yy});
}
}
}
}
} int main() {
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++) {
scanf("%s", map[i]+);
}
for(int i=; i<=n; i++) {
for(int j=; j<=m; j++) {
if(map[i][j] == '.') {
for(int k=; k<; k++) {
if(map[i+dx[k]][j+dy[k]] == '*') {
num[i][j]++;
}
}
}
else {
num[i][j] = ;
}
}
}
for(int i=; i<=n; i++) {
for(int j=; j<=m; j++) {
if(vis[i][j] == &&num[i][j] == ) {
P.push((node) {i, j});
vis[i][j] = ;
bfs(P.front());
ans++;
}
}
}
for(int i=; i<=n; i++) {
for(int j=; j<=m; j++) {
if(vis[i][j] == &&map[i][j] != '*')
ans++;
}
}
printf("%d", ans);
}
18清明校内测试T3的更多相关文章
- 18清明校内测试T2
一道数论好题(math) Time Limit:1000ms Memory Limit:128MB 题目描述 rsy最近在研究欧几里得算法,不会的同学可以去看下课件以及代码…… 现在她想到了一个新 ...
- 18清明校内测试T1
消失的数字(number) Time Limit:1000ms Memory Limit:128MB 题目描述 rsy拥有n个数,这n个数分别是a1,a2,…,an. 后来出现了一个熊孩子zhw, ...
- 2019.7.9 校内测试 T3 15数码问题
这一次是交流测试?边交流边测试(滑稽 15数码问题 大家应该都玩过这个15数码的游戏吧,就在桌面小具库那里面哦. 一看到这个题就知道要GG,本着能骗点分的原则输出了 t 个无解,本来以为要爆零,没想到 ...
- 2019.6.28 校内测试 T3 【音乐会】道路千万条
大眼一看最下面的题意解释的话,发现这和洛谷P1310表达式的值挺像的,大概都是给定一些运算符号,让最后的表达式为true的概率,为false的概率啥的QwQ~: 然后这个题嘛?就是在所有的运算符中提溜 ...
- 【8.30校内测试】【找规律模拟】【DP】【二分+贪心】
对于和规律或者数学有关的题真的束手无策啊QAQ 首先发现两个性质: 1.不管中间怎么碰撞,所有蚂蚁的相对位置不会改变,即后面的蚂蚁不会超过前面的蚂蚁或者落后更后面的蚂蚁. 2.因为所有蚂蚁速度一样,不 ...
- AMQ学习笔记 - 18. 持久化的测试
概述 对持久化的有效性进行测试. 测试实例 测试实例 结果预测 持久化递送 重启ActiveMQ后,消息还在队列中 非持久化递送 重启ActiveMQ后,消息不在队列中 demo设计 jms-prod ...
- 【10.11校内测试】【优先队列(反悔贪心)】【莫队】【stl的应用??离线处理+二分】
上次做过类似的题,原来这道还要简单些?? 上次那道题是每天可以同时买进卖出,所以用两个优先队列,一个存买进,一个存卖出(供反悔的队列). 这道题实际上用一个就够了???但是不好理解!! 所以我还是用了 ...
- 【8.14校内测试】【DP专题】
nlogn做法,dp[i]表示当前长度为i的最长上升子序列末尾元素的值. 不会写lower_bound(qwq,贴一个以前的好看点的代码 #include<iostream>//使用low ...
- 【9.7校内测试】【二分+spfa】【最长上升子序列】【状压DP+贪心(?)】
刘汝佳蓝书上的题,标程做法是从终点倒着$spfa$,我是二分答案正着$spfa$判断可不可行.效果是一样的. [注意]多组数据建边一定要清零啊QAQ!!! #include<iostream&g ...
随机推荐
- vmware 10虚拟机安装ubuntu server 14.04
-開始安装ubuntu server- 1.首先是安装系统时的语言,推荐选择English 然后安装系统 这里选择语言非常重要,我開始选择了中文,安装完毕后会乱码,所以推荐选择英文 由于在中国.所以选 ...
- 机器学习A
订阅地址 : http://blog.csdn.net/lizhe_dashuju/rss/list
- 143 - ZOJ Monthly, October 2015 I Prime Query 线段树
Prime Query Time Limit: 1 Second Memory Limit: 196608 KB You are given a simple task. Given a s ...
- 二分查找法(binary search)
二分查找法:一种在有序列表中查找某个值的算法,它每次都将待查找的空间分为两半,在其中一般继续查找. 使用二分查找的前提是:已经排序好的列表.否则,sum对其查找的结果不做保证. 代码实现: // 使用 ...
- 【POJ 1716】 Integer Intervals
[题目链接] 点击打开链接 [算法] 差分约束系统 [代码] #include <algorithm> #include <bitset> #include <cctyp ...
- Kafka详解与总结(五)
Kafka持久化 1. 概述 Kafka大量依赖文件系统去存储和缓存消息.对于硬盘有个传统的观念是硬盘总是很慢,这使很多人怀疑基于文件系统的架构能否提供优异的性能.实际上硬盘的快慢完全取决于使用它的方 ...
- git下
----------- 1. 分支管理策略 1)master分支 非常稳定的,只用来发布新版本,平时不在上面干活 2)dev分支 不稳定的,主要在上面干活,每个人都有自己的分支,时不时的往dev分支上 ...
- 题解报告:hdu 1232 畅通工程(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了 ...
- 自己做的一个android 音视频播放器
欢迎大家下载: http://download.csdn.net/detail/q610098308/8504335
- servlet.txt笔记
javase jdbc ==>java访问数据库html ==>浏览器显示内容,无法把数据提交给后台?==>动态网页技术(servlet)解决前台.后台交互问题动态网页技术:serv ...