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是怎么样?修改之后又是 ...
随机推荐
- Activity状态图、生命周期图(超详细),onSaveInstanceState只保存、恢复基本ui数据,持久数据不在这里保存。
1.Activity状态图 2.Activity生命周期简图 启动Activity: onCreate()—>onStart()—>onResume(),Activity进入running ...
- java实现九九乘法表
public class Demo { public static void main(String[] args) { for (int i = 1; i < 10; i++) { ...
- hdu 5036 Explosion bitset优化floyd
http://acm.hdu.edu.cn/showproblem.php?pid=5036 题意就是给定一副有向图,现在需要走遍这n个顶点,一开始出发的顶点是这n个之中的随便一个. 如果走了1,那么 ...
- [转]Azure 表存储和 Windows Azure SQL Database - 比较与对照
本文转自:https://msdn.microsoft.com/library/azure/jj553018 更新时间: 2014年10月 作者:Valery Mizonov 和 Seth Manhe ...
- math数学函数
Console.WriteLine("Math.Sign(12)--->{0})", Math.Sign(12)) Console.WriteLine("math. ...
- 锐动SDK针对游戏直播提出的解决方案
方案架构 PC端视频直播与录播功能为游戏厂商宣传,玩家个人秀,大型电竞赛事提供完美的技术解决方案. 直播形式灵活多变不,同音源的选择,画面切换,游戏中嵌入摄像头丰,富解说画面.突出主播个人魅力与粉丝形 ...
- [Tunny]Grunt基础介绍
[黄映焜/Tunny,20140711] Grunt是一个JavaScript任务管理器,对于需要反复重复的任务,例如压缩.编译.单元测试.代码检查等,自动化工具可以减轻你的劳动,简化你的工作. 本文 ...
- InChatter系统之服务客户端的开发
今天终于开始客户端的开发了,客户端完成以后,我们将可以进行简单的交流.开发完成的程序只是一个很简单的雏形,在本系统完成以后,以及完成的过程中,大家都可以下载源码,在此基础上融入自己的想法和尝试,可以按 ...
- Android Studio 打包APK时,出现3个或多个APK
Android Studio 打包APK时,原来只会出现一个apk,结果现在出现3个apk,仔细检查了一下项目文件发现: Android Studio 的 buid.gradle文件里有个配置项被更改 ...
- ASP.NET Excel下载方法一览
方法一 通过GridView(简评:方法比较简单,但是只适合生成格式简单的Excel,且无法保留VBA代码),页面无刷新 aspx.cs部分 using System; using System.Co ...