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是怎么样?修改之后又是 ...
随机推荐
- Xcode7 使用AFNetWorking 报错 添加Security.framework
Undefined symbols for architecture x86_64: "_SecCertificateCopyData", referenced from: _AF ...
- 221 Maximal Square 最大正方形
在一个由0和1组成的二维矩阵内,寻找只包含1的最大正方形,并返回其面积.例如,给出如下矩阵:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0返回 4. 详见:https://l ...
- C#_JDBC连接数据库
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ASP.Net 控件
简单控件 Label -作用是显示文字,编译后元素是Span 1.文本类 边框: BorderColor 边框颜色 BordersTyle 边框样式 BorderWidth 边框粗细 Literal- ...
- Java对象创建
今天发现一个问题: 如果加上第一个输出,那么两个per1的对象是不一样的,如果不加,那么下一个输出的对象的是和第一个是一致的? 思考为什么???? 代码如下: package com.lgq.serv ...
- php(三)使用PDO链接数据库
1.启动 mysql数据库,打开图形化控制界面 2.新建一个数据库 3.创建一个数据表 4.给数据表添加数据 id是数字类型的 类型选择int长度 11 username 等其他数据 会是字符串形 ...
- Android 给按钮添加监听事件
在安卓开发中,如果要给一个按钮添加监听事件的话,有以下三种实现方式 1.方式一 public class MainActivity extends ActionBarActivity { @Overr ...
- wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法
原文链接:wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法 最近升级wordpress之后,发现在文章编辑界面的添加新媒体和可视化按钮点击无反应,如下: 然后就在网上找解决办法, ...
- preg_replace_callback使用方法
官网解释: 执行一个正则表达式搜索并且使用一个回调进行替换 (PHP 4 >= 4.0.5, PHP 5) preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调 ...
- MFC如何设置窗口最前
首先,放到最前 this->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使窗口总是在最前面 this->Se ...