题目来源:小Hi小Ho的惊天大作战:扫雷·一

解题思路:因为只要确定了第一个是否有地雷就可以推算出后面是否有地雷(要么为0,要么为1,如果不是这两个值就说明这个方案行不通),如果两种可能中有一种成功,只需要计算包含有多少个1和多少个0,如果两种可能都成功了,都为1的才是有雷,都为0的才是没有地雷。

具体算法(java版,可以直接AC)

 import java.util.Scanner;

 public class Main {

     public static boolean flag1 = true;//当第一个为1(有雷)时,依次推算后的结果
public static boolean flag2 = true;//当第一个为0(没雷)时,依次推算后的结果 public static void solve(int[] maze, int[][] mine, int N) {
mine[0][1] = 1;//第一个有雷
mine[1][1] = 0;//第一个没雷 for (int i = 2; i <= N; i++) {
if (flag1) {
mine[0][i] = maze[i - 1] - mine[0][i - 1] - mine[0][i - 2];
//要么有雷,要么没雷
if (mine[0][i] == 1 || mine[0][i] == 0) {
flag1 = true;
} else {
flag1 = false;//推算失败
break;
}
}
} for (int i = 2; i <= N; i++) {
if (flag2) {
mine[1][i] = maze[i - 1] - mine[1][i - 1] - mine[1][i - 2];
if (mine[1][i] == 1 || mine[1][i] == 0) {
flag2 = true;
} else {
flag2 = false;
break;
}
}
}
if (flag1) {//验证最后一个是否正确
if (maze[N] != mine[0][N - 1] + mine[0][N]) {
flag1 = false;
}
}
if (flag2) {
if (maze[N] != mine[1][N - 1] + mine[1][N]) {
flag2 = false;
}
}
} public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int task = scanner.nextInt();
while (task > 0) {
task--;
int N = scanner.nextInt();
int[] maze = new int[N + 1];
int[][] mine = new int[2][N + 1];
for (int i = 1; i <= N; i++) {
maze[i] = scanner.nextInt();
}
flag1 = flag2 = true;
solve(maze, mine, N);
int hasMine = 0, noMine = 0;//统计有雷和没雷的数量
int[] hasMineAns = new int[N];
int[] noMineAns = new int[N];
if (flag1 && flag2) {//两种可能都成功
for (int i = 1; i <= N; i++) {
if (mine[0][i] == 1 && mine[1][i] == 1) {//同时为1(有雷)
hasMineAns[hasMine++] = i;
} else if (mine[0][i] == 0 && mine[1][i] == 0) {//同时为0(没雷)
noMineAns[noMine++] = i;
}
}
} else if (flag1 && !flag2) {//其中一种可能是成功的,另外一种失败
for(int i=1;i<=N;i++){
if(mine[0][i]==1){
hasMineAns[hasMine++] = i;
}else{
noMineAns[noMine++] = i;
}
}
} else if (!flag1 && flag2) {
for(int i=1;i<=N;i++){
if(mine[1][i]==1){
hasMineAns[hasMine++] = i;
}else{
noMineAns[noMine++] = i;
}
}
}
System.out.print(String.format("%d", hasMine));
for(int i=0;i<hasMine;i++){
System.out.print(String.format(" %d", hasMineAns[i]));
}
System.out.print(String.format("\n%d", noMine));
for(int i=0;i<noMine;i++){
System.out.print(String.format(" %d", noMineAns[i]));
}
System.out.println();
}
scanner.close();
}
}

hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告的更多相关文章

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

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

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

    原题地址 回溯+搜索 枚举每个位置上能否放地雷,当第i个位置枚举完成后,第i-1个位置的情况就确定了,此时,检查第i-1个位置是否满足要求,即左右间隔为1的范围内地雷数是否等于申明数字,如果满足条件, ...

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

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

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

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

  5. hihoCoder 1062 最近公共祖先·一 最详细的解题报告

    题目来源:最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 题目描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其 ...

  6. hihoCoder 1037 数字三角形 最详细的解题报告

    题目来源:hihoCoder 1037 数字三角形 解题思路:请好好看看 提示一.提示二.提示三 具体算法(java版,可以直接AC) import java.util.Scanner; public ...

  7. hihoCoder 1050 树中的最长路 最详细的解题报告

    题目来源:树中的最长路 解题思路:枚举每一个点作为转折点t,求出以t为根节点的子树中的‘最长路’以及与‘最长路’不重合的‘次长路’,用这两条路的长度之和去更新答案,最终的答案就是这棵树的最长路长度.只 ...

  8. hihoCoder 1052 基因工程 最详细的解题报告

    题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K= ...

  9. hihoCoder 1051 补提交卡 最详细的解题报告

    题目来源:补提交卡 解题思路:假设未提交程序的天数为:a1,a2,....,an,补交的张数为M.依次从a1,a2,....,an中去掉连续的 K 天(0<=K<=M),然后再来计算剩余数 ...

随机推荐

  1. Serval and Parenthesis Sequence【思维】

    Serval and Parenthesis Sequence 题目链接(点击) Serval soon said goodbye to Japari kindergarten, and began ...

  2. 最新 iOS 框架整体梳理(三)

    这一篇得把介绍框架这个系列终结了,不能超过三篇了,不然太长了..... 还是老规矩,前面两篇的机票在下方: 最新 iOS 框架整体梳理(一) 最新 iOS 框架整体梳理(二) Part - 3     ...

  3. cb38a_c++_STL_算法_transform

    cb38a_c++_STL_算法_transformtransform()算法有两种形式:transform(b1,e1,b2,op);//b1(源区间)的数据通过op函数处理,存放在b2(目标区间) ...

  4. 工业4.0:换热站最酷设计—— Web SCADA 工业组态软件界面

    前言 随着工业4.0的不断普及与发展,以及国民经济的飞速前进,我国的城市集中供热规模也不断扩大,科学的管理热力管网具有非常重大的经济和社会效益.目前热力系统,如换热站大都采用人工监控,人工监控不仅浪费 ...

  5. Java集合框架(不全,待继续整理)

    技术在线学习网站: https://www.runoob.com/java/java-collections.html 从上面的集合框架图可以看到: 1.Java 集合框架主要包括两种类型的容器: 1 ...

  6. 【JAVA8新的时间与日期 API】- 传统时间格式化的线程安全问题

    Java8之前的日期和时间API,存在一些问题,最重要的就是线程安全的问题.这些问题都在Java8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大. 传统时间格式化的线程安 ...

  7. 入门大数据---Spark_Structured API的基本使用

    一.创建DataFrame和Dataset 1.1 创建DataFrame Spark 中所有功能的入口点是 SparkSession,可以使用 SparkSession.builder() 创建.创 ...

  8. Python之浅谈装饰器

    目录 闭包函数 装饰器 迭代器 闭包函数 就是将原先需要调用好几遍的函数和参数写入一个包内,下次调用时一起调用 def name(x): x=1 def age(): print(x) return ...

  9. Docker(六)容器数据卷

    容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 需求:数据可以持久化和同步 使用数据卷 指定路径挂载 docker run -it -v 主机目录:容器内目录 # 测试 [root@h ...

  10. Java程序员阅读源码的小技巧,原来大牛都是这样读的,赶紧看看!

    今天介跟大家分享一下我平时阅读源码的几个小技巧,对于阅读java中间件如Spring.Dubbo等框架源码的同学有一定帮助. 本文基于Eclipse IDE,我们每天都使用的IDE其实提供了很多强大的 ...