题目链接:题目链接
题面:
小王来到了太空的精灵召唤基地,这里是太空小精灵的生产场所。
接着小张开始介绍这片基地,这是一片正方形的召唤阵,边长为 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 本题,必须学会奇偶性博弈的算法,从而通过本题。