原题地址

回溯+搜索

枚举每个位置上能否放地雷,当第i个位置枚举完成后,第i-1个位置的情况就确定了,此时,检查第i-1个位置是否满足要求,即左右间隔为1的范围内地雷数是否等于申明数字,如果满足条件,那么继续搜索下去,如果不满足条件,抛弃这个搜索分支。

搜索完成后,将所有可行解按位置“与”一下 ,找到那些一定为地雷或一定为空的格子。

最后输出即可。

代码:

 #include <iostream>
#include <cstring> using namespace std; void merge(int *t, int *r, int n) {
for (int i = ; i < n; i++) {
if (t[i] == - || t[i] == r[i])
t[i] = r[i];
else
t[i] = -;
}
} void find(int *a, int *r, int *t, int p, int n) {
if (p >= n) {
if ((n == && a[p - ] == r[p - ])
|| ((n > ) && a[p - ] == r[p - ] + r[p - ]))
merge(t, r, n);
}
else if (p == ) {
for (int i = ; i < ; i++) {
r[p] = i;
find(a, r, t, p + , n);
}
}
else if (p == ) {
for (int i = ; i < ; i++) {
r[p] = i;
if (a[p - ] == r[p - ] + r[p])
find(a, r, t, p + , n);
}
}
else {
for (int i = ; i < ; i++) {
r[p] = i;
if (a[p - ] == r[p] + r[p - ] + r[p - ])
find(a, r, t, p + , n);
}
}
} int main() {
int n; cin >> n;
while (n--) {
int N;
cin >> N;
int *a = new int[N];
int *r = new int[N];
int *t = new int[N]; for (int i = ; i < N; i++)
cin >> a[i];
memset(r, , N * sizeof(int));
memset(t, -, N * sizeof(int)); find(a, r, t, , N); int mine = ;
int not_mine = ; for (int i = ; i < N; i++) {
mine += (t[i] == ? : );
not_mine += (t[i] == ? : );
} cout << mine;
for (int i = ; i < N; i++)
if (t[i] == )
cout << " " << i + ;
cout << endl; cout << not_mine;
for (int i = ; i < N; i++)
if (t[i] == )
cout << " " << i + ;
cout << endl; delete t;
delete r;
delete a;
} return ;
}

hihoCoder#1114 小Hi小Ho的惊天大作战:扫雷·一的更多相关文章

  1. hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告

    题目来源:小Hi小Ho的惊天大作战:扫雷·一 解题思路:因为只要确定了第一个是否有地雷就可以推算出后面是否有地雷(要么为0,要么为1,如果不是这两个值就说明这个方案行不通),如果两种可能中有一种成功, ...

  2. hiho #1114 : 小Hi小Ho的惊天大作战:扫雷·一

    #1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 故事背景:密室.监视器与充满危机的广场 “我们还是循序渐进,先来考虑这 ...

  3. hihoCoder#1120 小Hi小Ho的惊天大作战:扫雷·三

    原题地址 看上去非常复杂, 实际上是这一系列最简单的一步,本质上是个搜索过程,相比于前一道题,可以不用策略三,而且题目的数据规模超级小,所以暴力搜索就能过. 把尚未确定的点放在一个unsettled列 ...

  4. hihoCoder#1119 小Hi小Ho的惊天大作战:扫雷·二

    原题地址 没有复杂算法,就是麻烦,写起来细节比较多,比较考验细心,一次AC好开心. 代码: #include <iostream> #include <vector> #inc ...

  5. 【转】HTML5的小知识点小集合

    html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于<h ...

  6. html5的小知识点小集合

      html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于< ...

  7. 微信小程序即将开放申请?微信小论坛小程序专场16日或可见分晓

    9月22号微信小程序内测至今已经好一段时间了,首批只开放了200个名额,没拿到内测资格的朋友早就等到心急了.就在刚刚,微信公开课宣布微信小论坛小程序专场即将在11月16号举行,微信公众平台小程序会在当 ...

  8. 如何获取微信小店小程序的AppID

    2017年11月16日,微信有一个重磅的宣布:为了帮商家在微信内快速开店,方便商家和用户之间沟通,所有认证公众号,可快速创建微信小店小程序.这个改变是否能给微信小店带来新的生机?还需要时间的考验.微信 ...

  9. 微信小游戏 小程序与小游戏获取用户信息接口调整 wx.createUserInfoButton

    参考: 小程序•小故事(6)——微信登录能力优化 小程序•小故事(4)——获取用户信息 本篇主要是讲微信getUserInfo接口不再出现授权弹框 那么原来getUserInfo是怎么样?修改之后又是 ...

随机推荐

  1. 关于通过spring-web的ServletRequestUtils工具类对获取getParameter传参的默认转换基本数据类型的学习

    基于spring-web(4.1.4)包的org.springframework.web.bind.ServletRequestUtils工具类对HttpServletRequest获取的传递入参获取 ...

  2. AJPFX关于modifier总结

    修饰符总结 Modifiers        函数修饰符始终在返回值类型之前!!!        变量修饰符始终在变量类型之前!!!---------------------------------- ...

  3. 一段js实现复制文本内容到剪切板

    <script type="text/javascript"> function copyUrl2() { var Url2=document.getElementBy ...

  4. ES6学习笔记(1)----let和const命令

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ let和const命令 let 总结1.声明变量基本使用方法与var 相同  不同点  a.在代 ...

  5. ESLint - 简介

    ESLint是一个QA工具,用来避免低级错误和统一代码的风格. ESLint被设计为完全可配置的,主要有两种方式来配置ESLint: 在注释中配置:使用JavaScript注释直接把配置嵌入到JS文件 ...

  6. 掌握Spark机器学习库-02-mllib数据格式

    MLlib 1.MLlib介绍 1)MLlib特点 2)哪些算法 3)阅读官方文档 MLlib提供了哪些: 算法 特征工程 管道 持久化 2.MLlib数据格式 1)本地向量 2)标签数据 3)本地矩 ...

  7. R in action读书笔记(9)-第八章:回归 -回归诊断

    8.3回归诊断 > fit<-lm(weight~height,data=women) > par(mfrow=c(2,2)) > plot(fit) 为理解这些图形,我们来回 ...

  8. JVM 优点与缺点的深入分析

    Java 最初诞生的时候,它可以说是其他语言的进化版.不仅因为Java很简单,而且这一进化的语言还是一个可以运行第三方硬件字节码的虚拟机.它还是垃圾收集站,从而令存储管理和内核转储(core dump ...

  9. InChatter系统之客户端实现原理与阶段小结

    InChatter客户端的开发可以说是目前系统的阶段性结尾了.很抱歉的是,这篇文章来的这么晚,迟到了这么久. 在客户端的开发主要针对两个方面: 消息的传输与处理 消息的UI交互处理 一.消息的传输与处 ...

  10. 【C++】模板简述(一):模板的引入

    我们在介绍模板之前,首先想象有这么一个场景: 我们需要通过C++写出一个通用的加法程序,那么有如下几种方法: 方法一:C++的函数重载 //int int int int Add(int l,int ...