华硕编程竞赛11月JAVA专场 D题飞机大战 题解
作者主页:Designer 小郑
作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师,全栈领域优质创作者,在校期间参加PAT乙级考试获得满分,三年ACM竞赛经验,斩获国奖两项,省奖五项。热爱技术、专注业务、开放合作、乐于分享,期待你我共同成长!
主打方向:Vue、SpringBoot、微信小程序
题目链接:题目链接
题面:
小王在太空完成遨游后,就受邀来到了太空的飞机场指挥室,“太空号”少将小张早已等候他多时!
指挥所窗外是看不到界限的直线停机场,小张要和小王比试飞机的指挥能力,小王接受了挑战!
比赛规则是这样的:
- 设指挥所窗外的第一个停机位编号为 0,窗外的第二个停机位编号为 1,以此类推。
- 小王和小张双方轮流将某辆飞机召回到距离指挥所更近的停机位。
- 飞机场上停有
N
辆初始的飞机,停机位编号分别为a[0] 到 a[n-1]
(取值大于0,即没有初始就停在编号为 0 的飞机)。 - 飞机可以在这个超级太空中复用空间,即可以重叠排放,允许一个停机场停放无数多辆飞机,但最近只能召回到指挥所窗外的第一个停机位。
- 当所有的初始飞机都被召回到指挥所窗外的第一个停机位时,最后召回的人获胜。
小张很赏识小王的作战能力,每次比赛都让小王先手指挥,请问小王能获胜吗?
若小王可以获胜,请输出 Yes
,若不能获胜则输出 No
。
引用说明:上面的图片来源于蓝桥云课。
知识点
- Java 的异或运算
- 必败态的分析
- 尼姆博弈
初始代码
public class FMain {public static String doWork(List<Integer> list) {//代码编辑区 开始return "No";//代码编辑区 结束}public static void main(String[] args) {//测试用例System.out.println((Objects.equals("Yes",doWork(Arrays.asList(7,7,7))) ? "【√正确】" : "【X错误】 ") + "初始飞机停车编号为: 7 7 7,答案:" + doWork(Arrays.asList(7,7,7)));System.out.println((Objects.equals("No",doWork(Arrays.asList(7,7))) ? "【√正确】" : "【X错误】") + " 初始飞机停车编号为: 7 7,答案:" + doWork(Arrays.asList(7,7)));}
}
样例说明
输入数据是一个 List,里面包括了 N 辆飞机的停机场编号。
如 List 内数值为 [7, 7, 7],代表初始有三辆飞机,均停在编号为 7 的停机场,小王只需先召回其中一辆飞机到第一个停机位,剩下只要学小张的方法即可,必定可以获胜,输出 Yes
。
如 List 内数值为 [7, 7],代表初始有两辆飞机,均停在编号为 7 的停机场,不管小王如何召回,小张只要学小王的方法必定获胜,所以小王必败,输出 No
。
题解
考察对尼姆博弈的理解,此题寻找 必败态(0,0) 为关键。
若只有两辆飞机,且处于同一位置,则为先手的必败态,即(N,N)是必败态。
若有三辆飞机,其中两辆处于同一位置,第三辆在零点,即(N,N,0)也是必败态。
根据尼姆博弈的理论,可以推出飞机下标值的异或结果 X
,若 X
等于 0,则小王可以获得胜利,否则小张胜利。
参考代码如下:
import java.util.Arrays;
import java.util.List;
import java.util.Objects;public class FAns {public static String doWork(List<Integer> list) {//代码编辑区 开始int ans = 0;for (Integer i : list) {ans ^= i;}return Objects.equals(0,ans) ? "No" : "Yes";//代码编辑区 结束}public static void main(String[] args) {//测试用例System.out.println((Objects.equals("Yes",doWork(Arrays.asList(7,7,7))) ? "【√正确】" : "【X错误】 ") + "初始飞机停车编号为: 7 7 7,答案:" + doWork(Arrays.asList(7,7,7)));System.out.println((Objects.equals("No",doWork(Arrays.asList(7,7))) ? "【√正确】" : "【X错误】") + " 初始飞机停车编号为: 7 7,答案:" + doWork(Arrays.asList(7,7)));}
}
总结
要 AC 本题,必须学会尼姆博弈的算法,找到先手或后手的必败态,再尔退出必胜态,最终通过本题。
华硕编程竞赛11月JAVA专场 D题飞机大战 题解相关推荐
- 华硕编程竞赛11月JAVA专场 A题自由弹簧 题解
作者主页:Designer 小郑 作者简介:软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导.CSDN学院 ...
- 华硕编程竞赛11月JAVA专场 C题太空遨游 题解
作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...
- 华硕编程竞赛11月JAVA专场 G题飞行棋 题解
作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...
- 华硕编程竞赛11月JAVA专场 B题召唤精灵 题解
作者主页:Designer 小郑 作者简介:软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导.CSDN学院 ...
- 华硕编程竞赛11月JAVA专场 J题再见天空 题解
作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...
- 关于517编程的11月月赛
关于517编程的11月月赛-Nov.29 by Jasonxu 我是传送门 T1:umin之和 1.1题目 小海狸定义 umin为最小的没有在子集中出现过的非负整数. 小海狸有一组非负整数,他希望将这 ...
- Java多线程编写简易飞机大战(一)
** Java多线程编写简易飞机大战(一) ** 利用多线程编写飞机大战,主要有3个关键: ①继承Thread类,重写run方法: ②线程工作代码在run方法中写: ③启动时,调用线程对象的start ...
- 用JAVA制作小游戏——飞机大战(三)
本篇博客是对飞机大战游戏项目完整代码的展示 详细代码讲解: 用JAVA制作小游戏--飞机大战(一) 用JAVA制作小游戏--飞机大战(二) 最下方附整个程序的文件下载链接 代码展示 主界面 impor ...
- 用JAVA制作小游戏——飞机大战(二)
本篇博客是对飞机大战游戏使用代码的展示 重难点: 首先需要鼠标能够控制战机,使鼠标在窗口内时始终能够使战机的位置与鼠标相同,实现鼠标控制战斗机移动. 其次需要能够以一定的速度产生子弹和敌机,并且以一定 ...
最新文章
- java猜数游戏有次数限制_“去小学化”之后,可以这样开展数学游戏,让孩子玩中学,学中乐!...
- 西门子opc服务器注册,《西门子opc服务器的说明》.pdf
- Redis内存分析方法
- Solidworks二次开发 Addin模版使用
- 产品的思维与技术的思维差异
- 微信小程序开发工具调试没问题,真机调试Provisional headers are shown
- 华为云ManageOne北向对接之基本名词概念(一)
- 江南爱窗帘十大品牌,怎么合理的搭配窗帘配色
- 如何将fsdb波形转成csv等可读性文本格式
- nand flash基础——基本结构
- Gym-101502J(取数博弈+dp)
- import numpy出现ImportError: DLL load failed: 找不到指定的模块的解决方案
- oracle导入报错ora01652,Oracle ORA-01652错误
- 0、PIC系列参考手册中文版文档汇总
- 线程定义, 实现方式及代码实现.
- python 文件读取错误之FileNotFoundError: [Errno 2] No such file or directory:,顺便学习斜杠/和反斜杠\的用法
- NVIDIA NCCL 源码学习(九)- 单机内ncclSend和ncclRecv的过程
- 复古传世手游服务器维护,新出的《复古传世》手游到底应该怎么玩,这里有篇攻略供大侠参考...
- txt文档操作(导出和导入)【工具包系列】
- js随机生成彩票号码 双色球