hihoCoder#1119 小Hi小Ho的惊天大作战:扫雷·二
没有复杂算法,就是麻烦,写起来细节比较多,比较考验细心,一次AC好开心。
代码:
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdlib> using namespace std; #define SIZE 400 int N, M;
int map[SIZE][SIZE];
int res[SIZE][SIZE]; vector<pair<int, int> > unknown_neighbors(int i, int j) {
vector<pair<int, int> > nbs; for (int ii = -; ii < ; ii++)
for (int jj = -; jj < ; jj++) {
int r = ii + i;
int c = jj + j;
if (r >= && r < N && c >= && c < M && (r != i || c != j) && map[r][c] < )
nbs.push_back(pair<int, int>(r, c));
} return nbs;
} vector<pair<int, int> > known_counterparts(int i, int j) {
vector<pair<int, int> > cps; for (int ii = -; ii < ; ii++) {
for (int jj = -; jj < ; jj++) {
int r = ii + i;
int c = jj + j;
if (r >= && r < N && c >= && c < M && (r != i || c != j) && map[r][c] >= )
cps.push_back(pair<int, int>(r, c));
}
} return cps;
} vector<pair<int, int> > differ(vector<pair<int, int> > &a, vector<pair<int, int> > &b) {
vector<pair<int, int> > diff;
int count = ; for (auto pa : a) {
bool found = false;
for (auto pb : b) {
if (pb == pa) {
found = true;
count++;
break;
}
}
if (!found)
diff.push_back(pa);
} if (count < b.size())
diff.clear(); return diff;
} void merge_pos(int i, int j, int v) {
if (res[i][j] == - || res[i][j] == v)
res[i][j] = v;
else
res[i][j] = -;
} void solve() {
for (int i = ; i < N; i++)
for (int j = ; j < M; j++) {
if (map[i][j] == ) {
vector<pair<int, int> > nbs = unknown_neighbors(i, j);
for (auto p : nbs)
merge_pos(p.first, p.second, );
}
else if (map[i][j] > ) {
vector<pair<int, int> > nbs = unknown_neighbors(i, j);
if (nbs.size() == map[i][j]) {
for (auto p : nbs)
merge_pos(p.first, p.second, );
continue;
} vector<pair<int, int> > cps = known_counterparts(i, j);
for (auto p : cps) {
vector<pair<int, int> > cp_nbs = unknown_neighbors(p.first, p.second);
if (nbs.size() <= cp_nbs.size() || map[i][j] <= map[p.first][p.second])
continue;
vector<pair<int, int> > diff = differ(nbs, cp_nbs);
if ((int) (nbs.size() - cp_nbs.size()) == map[i][j] - map[p.first][p.second] && !diff.empty())
for (auto dp : diff)
merge_pos(dp.first, dp.second, );
}
}
}
} int main() {
int n; cin >> n;
while (n--) {
cin >> N >> M;
for (int i = ; i < N; i++)
for (int j = ; j < M; j++)
cin >> map[i][j];
memset(res, -, SIZE * SIZE * sizeof(int)); solve(); int mine = ;
int not_mine = ; for (int i = ; i < N; i++)
for (int j = ; j < M; j++) {
mine += (res[i][j] == ? : );
not_mine += (res[i][j] == ? : );
} cout << mine << " " << not_mine << endl;
} return ;
}
hihoCoder#1119 小Hi小Ho的惊天大作战:扫雷·二的更多相关文章
- hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告
题目来源:小Hi小Ho的惊天大作战:扫雷·一 解题思路:因为只要确定了第一个是否有地雷就可以推算出后面是否有地雷(要么为0,要么为1,如果不是这两个值就说明这个方案行不通),如果两种可能中有一种成功, ...
- hiho #1114 : 小Hi小Ho的惊天大作战:扫雷·一
#1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 故事背景:密室.监视器与充满危机的广场 “我们还是循序渐进,先来考虑这 ...
- hihoCoder#1120 小Hi小Ho的惊天大作战:扫雷·三
原题地址 看上去非常复杂, 实际上是这一系列最简单的一步,本质上是个搜索过程,相比于前一道题,可以不用策略三,而且题目的数据规模超级小,所以暴力搜索就能过. 把尚未确定的点放在一个unsettled列 ...
- hihoCoder#1114 小Hi小Ho的惊天大作战:扫雷·一
原题地址 回溯+搜索 枚举每个位置上能否放地雷,当第i个位置枚举完成后,第i-1个位置的情况就确定了,此时,检查第i-1个位置是否满足要求,即左右间隔为1的范围内地雷数是否等于申明数字,如果满足条件, ...
- 【转】HTML5的小知识点小集合
html5的小知识点小集合 html5知识 1. Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于<h ...
- html5的小知识点小集合
html5的小知识点小集合 html5知识 1. Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于< ...
- 微信小程序即将开放申请?微信小论坛小程序专场16日或可见分晓
9月22号微信小程序内测至今已经好一段时间了,首批只开放了200个名额,没拿到内测资格的朋友早就等到心急了.就在刚刚,微信公开课宣布微信小论坛小程序专场即将在11月16号举行,微信公众平台小程序会在当 ...
- 如何获取微信小店小程序的AppID
2017年11月16日,微信有一个重磅的宣布:为了帮商家在微信内快速开店,方便商家和用户之间沟通,所有认证公众号,可快速创建微信小店小程序.这个改变是否能给微信小店带来新的生机?还需要时间的考验.微信 ...
- 微信小游戏 小程序与小游戏获取用户信息接口调整 wx.createUserInfoButton
参考: 小程序•小故事(6)——微信登录能力优化 小程序•小故事(4)——获取用户信息 本篇主要是讲微信getUserInfo接口不再出现授权弹框 那么原来getUserInfo是怎么样?修改之后又是 ...
随机推荐
- magento 添加事件
首先是配置文件config.xml里的配置 <checkout_cart_save_after> /*事件名字*/ <observers> <deal> /*模块名 ...
- 修改SolrCloud在ZooKeeper中的配置文件操作记录
修改SolrCloud在ZooKeeper中的配置文件操作记录. 命令执行目录: /opt/solr-/server/scripts/cloud-scripts/ 1.下载配置文件 ./zkcli., ...
- mac系统 usr/ 目录下无法新建文件夹???
这个问题是在操作mongodb的时候遇到的,很苦恼.目前已经解决,将解决方法分享给各位遇到同样问题的你们. 1.重启电脑,开始关机就立马按住command+R,进入macOS恢复功能界面,进入的时间可 ...
- struts2 源码地址
http://archive.apache.org/dist/struts/
- R Programming week1-Data Type
Objects R has five basic or “atomic” classes of objects: character numeric (real numbers) integer co ...
- OpenFlow_tutorial_2_Install_Required_Software
一.Required Software 我操作系统用的 ubuntu 18.04.vm image的OS是ubuntu14.04,这两个系统的GUI应该已经不兼容了,如果使用ubuntu18.04的主 ...
- JavaScript 原生代码找对象的方法
1. id : document.getElementById('id') 2. 标签 : document.getElementsByTagName('标签') //获得的是一个标签数组 3. N ...
- Codeforces Round #569 题解
Codeforces Round #569 题解 CF1179A Valeriy and Deque 有一个双端队列,每次取队首两个值,将较小值移动到队尾,较大值位置不变.多组询问求第\(m\)次操作 ...
- Bzoj 3307 雨天的尾巴(线段树合并+树上差分)
C. 雨天的尾巴 题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式 第 ...
- python中的next()以及iter()函数
我们首先要知道什么是可迭代的对象(可以用for循环的对象)Iterable: 一类:list,tuple,dict,set,str 二类:generator,包含生成器和带yield的generato ...