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

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

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

  1 import java.util.Scanner;
  2
  3 public class Main {
  4
  5     public static boolean flag1 = true;//当第一个为1(有雷)时,依次推算后的结果
  6     public static boolean flag2 = true;//当第一个为0(没雷)时,依次推算后的结果
  7
  8     public static void solve(int[] maze, int[][] mine, int N) {
  9         mine[0][1] = 1;//第一个有雷
 10         mine[1][1] = 0;//第一个没雷
 11
 12         for (int i = 2; i <= N; i++) {
 13             if (flag1) {
 14                 mine[0][i] = maze[i - 1] - mine[0][i - 1] - mine[0][i - 2];
 15                                 //要么有雷,要么没雷
 16                 if (mine[0][i] == 1 || mine[0][i] == 0) {
 17                     flag1 = true;
 18                 } else {
 19                     flag1 = false;//推算失败
 20                     break;
 21                 }
 22             }
 23         }
 24
 25         for (int i = 2; i <= N; i++) {
 26             if (flag2) {
 27                 mine[1][i] = maze[i - 1] - mine[1][i - 1] - mine[1][i - 2];
 28                 if (mine[1][i] == 1 || mine[1][i] == 0) {
 29                     flag2 = true;
 30                 } else {
 31                     flag2 = false;
 32                     break;
 33                 }
 34             }
 35         }
 36         if (flag1) {//验证最后一个是否正确
 37             if (maze[N] != mine[0][N - 1] + mine[0][N]) {
 38                 flag1 = false;
 39             }
 40         }
 41         if (flag2) {
 42             if (maze[N] != mine[1][N - 1] + mine[1][N]) {
 43                 flag2 = false;
 44             }
 45         }
 46     }
 47
 48     public static void main(String[] args) {
 49         Scanner scanner = new Scanner(System.in);
 50         int task = scanner.nextInt();
 51         while (task > 0) {
 52             task--;
 53             int N = scanner.nextInt();
 54             int[] maze = new int[N + 1];
 55             int[][] mine = new int[2][N + 1];
 56             for (int i = 1; i <= N; i++) {
 57                 maze[i] = scanner.nextInt();
 58             }
 59             flag1 = flag2 = true;
 60             solve(maze, mine, N);
 61             int hasMine = 0, noMine = 0;//统计有雷和没雷的数量
 62             int[] hasMineAns = new int[N];
 63             int[] noMineAns = new int[N];
 64             if (flag1 && flag2) {//两种可能都成功
 65                 for (int i = 1; i <= N; i++) {
 66                     if (mine[0][i] == 1 && mine[1][i] == 1) {//同时为1(有雷)
 67                         hasMineAns[hasMine++] = i;
 68                     } else if (mine[0][i] == 0 && mine[1][i] == 0) {//同时为0(没雷)
 69                         noMineAns[noMine++] = i;
 70                     }
 71                 }
 72             } else if (flag1 && !flag2) {//其中一种可能是成功的,另外一种失败
 73                 for(int i=1;i<=N;i++){
 74                     if(mine[0][i]==1){
 75                         hasMineAns[hasMine++] = i;
 76                     }else{
 77                         noMineAns[noMine++] = i;
 78                     }
 79                 }
 80             } else if (!flag1 && flag2) {
 81                 for(int i=1;i<=N;i++){
 82                     if(mine[1][i]==1){
 83                         hasMineAns[hasMine++] = i;
 84                     }else{
 85                         noMineAns[noMine++] = i;
 86                     }
 87                 }
 88             }
 89             System.out.print(String.format("%d", hasMine));
 90             for(int i=0;i<hasMine;i++){
 91                 System.out.print(String.format(" %d", hasMineAns[i]));
 92             }
 93             System.out.print(String.format("\n%d", noMine));
 94             for(int i=0;i<noMine;i++){
 95                 System.out.print(String.format(" %d", noMineAns[i]));
 96             }
 97             System.out.println();
 98         }
 99         scanner.close();
100     }
101 }

转载于:https://www.cnblogs.com/pinxiong/p/5248573.html

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

  1. 《Java小游戏》:球球大作战

    此文转载自:https://blog.csdn.net/pandas_dream/article/details/113086334 目录 游戏规则 主要实现方法 游戏流程展示 1. 开始游戏页面 2 ...

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

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

  3. 论AI小游戏是怎么练成的——『寻物大作战』原理揭秘

    AI诞生以来,应用在了各个场景来帮助人们提高效率,优化体验.而在娱乐领域,越来越多的电子游戏开始将AI技术与游戏结合.今天我们为大家带来『寻物大作战』小游戏,真是称得上小小的身体,大大的能量!只要在规 ...

  4. java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​ 坐标.大小.颜色.方向.速度 2.抽象类:Ball ​ 设计类:BallMain-创建窗体 ​ BallJPanel- ...

  5. Unity3D小功能 小技巧 小教程 小原理(持续更新...)

    Unity3D小功能 小技巧 小教程 小原理(持续更新...) 1.Unity的.NET版本是2.0 按道理来说,C#能用的功能Unity也能用,但是Unity的.NET却不是最新版 要是用一些别的D ...

  6. Python的一些小技巧小知识

    Chapter 12. HOW-TO 本章内容记录Python的一些小技巧小知识.来源是网上摘录或自己学习所得. 如何判断操作系统类型 import sys print sys.platform pr ...

  7. yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)

    1264: yxy和志愿者小姐姐番外篇之大宝宝123追番记 时间限制: 1 Sec  内存限制: 64 MB                                               ...

  8. 链表划分为左小、中相等、右大

    解题思路:将一个链表分成三个链表,最后重新连接三个链表 (1)分成三个链表的过程是一致的:以左小链表为例依次遍历原链表的每一个节点cur,当cur->data<pivot时,把cur取出, ...

  9. Paddle.js PaddleClas 实战 ——『寻物大作战』AI 小游戏

    1. 前言 AI 自诞生以来就应用在各个科技前沿领域,随着发展进程加快,在娱乐方面也有越来越多的趣味性游戏开始将AI融入其中.『寻物大作战』正是一款基于 AI 能力打造的趣味性小游戏,目的就是让玩家通 ...

最新文章

  1. Window 10 :如何彻底关闭:Windows Defender Service(2015-12-20日更新)
  2. 单链表反转的原理和python代码实现
  3. Android之用sharedUserId来实现不同应用(APK)数据共享
  4. Katy Perry - E.T.
  5. Extjs中的组件含有ID,会导致界面混乱。(textfield,comboBox等)
  6. matlab 游标 精度,如何在MATLAB数据光标中显示更高精度的数字?
  7. 建议0 不要让main函数返回void
  8. 征服RIA:函数式编程的原理
  9. android选择图片,通过uri获取路径
  10. Cisco常见命令大全
  11. Ubuntu:back up whole system
  12. Arm中国“战火”升级:第三封声明再次否认CEO吴雄昂被董事会罢免
  13. 2018 ps常用字体打包下载
  14. 计算机本地组策略编辑器在哪里,win7系统本地组策略编辑器在哪的操作方法
  15. 三件套都有什么_床上用品三件套,四件套,五件套,七件套分别包括的是哪些...
  16. 图像mnf正变换_基于MNF 变换的多元变化检测变化信息的集中
  17. 【CANN训练营第三季】【进阶班笔记3】PyTorch安装与环境配置
  18. 什么是SOA?为什么要SOA?
  19. 如何用 身份证OCR 接口进行快速开发
  20. setup time hold time violation

热门文章

  1. 奥特曼传奇英雄存档丢了怎么找回_热血传奇:道士最帅武器—玄天
  2. 自组网中继台_同频自组网基站
  3. Redhat Linux 7.3 虚拟机通过USB挂载NTFS格式的移动硬盘
  4. 移动端REM布局方案
  5. activiti jbpm相关资源
  6. 锋利的jQuery--编写jQuery插件(读书笔记五)[完结篇]
  7. 使用PDFBox解析PDF文件
  8. maven常见问题问答 收藏
  9. 多线程创建方式 线程池、Future和CompletableFuture
  10. idea的plugins无法使用marketplace plugins are not loaded