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是怎么样?修改之后又是 ...
随机推荐
- DP(递归打印路径) UVA 662 Fast Food
题目传送门 题意:n个饭店在一条直线上,给了它们的坐标,现在要建造m个停车场,饭店没有停车场的要到最近的停车场,问所有饭店到停车场的最短距离 分析:易得区间(i, j)的最短距离和一定是建在(i + ...
- Android 插件技术:动态加载dex技术初探
1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...
- Xcode7 使用AFNetWorking 报错 添加Security.framework
Undefined symbols for architecture x86_64: "_SecCertificateCopyData", referenced from: _AF ...
- 学习笔记 第十三章 使用CSS3新布局
第13章 使用CSS3新布局 [学习重点] 设计多列布局 设计弹性盒布局样式 使用CSS3布局技术设计适用移动需求的网页 13.1 多列布局 CSS3使用columns属性定义多列布局,用法如下 ...
- javascript之input获取的时间减1秒&&t时间恢复
将输入得到的时间减少1秒:20:00:00 ——— 19:59:59 方法一:普通时间转换 endDateMap(date){ var h = new Date(date).getHours ...
- MTK处理器手机 解锁Bootloader 教程
目前很多手机都需要解锁Bootloader之后才能进行刷机操作 本篇教程教你如何傻瓜式解锁Bootloader 首先需要在设置-关于手机 找到版本号(个别手机可能是内核版本号,甚至其他) 然后 快 ...
- iOS Programming Localization 本地化
iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...
- 为什么jfinal的控制器不用单例模式
先假controller定采用单例模式,通常两种设计方式来存放 HttpServletRequest.HttpServletResponse 等对象,一是利用一个类似于 ActionContext 的 ...
- @import与link方式的区别
1. 老祖宗的差别.link属于XHTML标签,而@import完全是CSS提供的一种方式. link标签除了可以加载CSS外,还可以做很多其它的事情,比如定义RSS,定义rel连接属性等,@impo ...
- BotFramework学习-02
1.请求的Message格式 { "type": "Message", "id": "fd89606f8014453ca5587e ...