作者主页:Designer 小郑
作者简介:软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师,全栈领域优质创作者,在校期间参加PAT乙级考试获得满分,三年ACM竞赛经验,斩获国奖两项,省奖五项。热爱技术、专注业务、开放合作、乐于分享,期待你我共同成长!
主打方向:Vue、SpringBoot、微信小程序
题目链接:题目链接
题面:
小王来到了太空的精灵召唤基地,这里是太空小精灵的生产场所。
接着小张开始介绍这片基地,这是一片正方形的召唤阵,边长为 N
(1 < N < 10000),每次精灵召唤任务由两名召唤师担任。
召唤第一个精灵时,必须在角落开始召唤(即正方形的四个角落之一),召唤 X + 1
个精灵时,第 X + 1
个精灵必须在第 X
个召唤精灵的四周(即上下左右),且每个精灵位只能存放一个精灵。
当某位召唤师无法再召唤精灵时,另外一位召唤师取得了胜利!
小王开始首轮召唤,请问小王可以获得胜利吗?若小王可以获胜,请输出 Yes
,若不能获胜则输出 No
。
引用说明:上面的图片来源于蓝桥云课。
知识点
- Java 的条件语法
- 基础博弈分析
初始代码
public class GMain {
public static String doWork(int n) {
//代码编辑区 开始
return "Yes";
//代码编辑区 结束
}
public static void main(String[] args) {
//测试用例
System.out.println((Objects.equals("No",doWork(2)) ? "【√正确】" : "【X错误】 ") + "召唤场边长为: 2,答案:" + doWork(2));
System.out.println((Objects.equals("Yes",doWork(3)) ? "【√正确】" : "【X错误】") + " 召唤场边长为: 3,答案:" + doWork(3));
}
}
样例说明
输入数据是一个整数 N
,代表召唤场的边长,小王和小张都非常了解游戏规则,当一人明知可赢但故意走错让对方赢的情况,无需考虑。
游戏开始时,由小王首轮召唤。
若小王可以获胜,请输出 Yes
,若不能获胜则输出 No
。
题解
考察对奇偶性博弈的理解,N*N的方格,走过的格子不能走,第一格在角落上,最后无路可走就算输,求最后谁赢。
先手下棋后,剩余精灵召唤位个数为 N * N -1
,若 N * N -1
为偶数,则先手小王胜利,否则小张胜利。
因为奇数的平方是奇数,偶数的平方是偶数,所以题解可以简化为:
若 N
为奇数,先手小王胜利,反之小张胜利。
参考代码如下:
import java.util.Objects;
public class GAns {
public static String doWork(int n) {
//代码编辑区 开始
return (n&1) > 0 ? "Yes" : "No";
//代码编辑区 结束
}
public static void main(String[] args) {
//测试用例
System.out.println((Objects.equals("No",doWork(2)) ? "【√正确】" : "【X错误】 ") + "召唤场边长为: 2,答案:" + doWork(2));
System.out.println((Objects.equals("Yes",doWork(3)) ? "【√正确】" : "【X错误】") + " 召唤场边长为: 3,答案:" + doWork(3));
}
}
总结
要 AC 本题,必须学会奇偶性博弈的算法,从而通过本题。