题目来源:小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. selenium获取图片验证码

    # encoding:utf-8 from PIL import Image from selenium import webdriver url = '网站地址' driver = webdrive ...

  2. python_lesson2 多进程探索 (multiprocessing包)

    进程池 进程池 (Process Pool)可以创建多个进程.这些进程就像是随时待命的士兵,准备执行任务(程序).一个进程池中可以容纳多个待命的士兵.       import multiproces ...

  3. 1、安装配置Git私有服务器

    安装并配置一个私有的Git服务器吧,这样自己的代码就可以进行版本控制了,当然版本控制的重要性嘛,Please Baidu. 系统环境:64位Win10 Version 1909 安装步骤: 1.下载j ...

  4. 记linux vsftpd配置遇到的错误

    环境:centos 7 yum安装 yum install -y vsftpd 增加用户 # 家目录为/www 并设置nologin useradd -d /www -s /sbin/nologin ...

  5. 兄弟打印机MFC代码示范

    m_strModel.LoadString(IDS_MODEL_STRING); //IDS_MODEL_STRING,字符串控件的ID,资源视图-String Table里面设置 m_strSour ...

  6. cb47a_c++_STL_算法_排列组合next_prev_permutation

    cb47a_c++_STL_算法_排列组合next_prev_permutation 使用前必须先排序.必须是 1,2,3或者3,2,1.否者结果不准确.如果, 1,2,4,6.这样数据不会准确nex ...

  7. phpmyadmin通过慢查询日志getshell连载(二)

    这是phpmyadmin系列渗透思路的第二篇文章,前面一篇文章阐述了通过全局日志getshell,但是还有一个日志可以getshell,那就是本次实验的慢查询日志,操作类似,毕竟实战中多一条路就多一次 ...

  8. snprintf和sprintf区别分析

    目录[-] snprintf函数的返回值 snprintf函数的字符串缓冲 今天在项目中使用snprintf时遇到一个比较迷惑的问题,追根溯源了一下,在此对sprintf和snprintf进行一下对比 ...

  9. C/C++以及Linux文件操作备忘录

    目录 C文件操作 文件开关 文件读写 C++文件操作 Linux文件操作 打开 C文件操作 #include<stdio.h> stdin, stdout, stderr 文件开关 /* ...

  10. 磨皮美颜算法 附完整C代码

    前言 2017年底时候写了这篇<集 降噪 美颜 虚化 增强 为一体的极速图像润色算法 附Demo程序> 这也算是学习过程中比较有成就感的一个算法. 自2015年做算法开始到今天,还有个把月 ...