经典算法之巴什博弈变形

这里以2018年全国多校算法寒假训练营练习比赛(第三场)之小牛vs小客为例。

题目链接:https://www.nowcoder.com/acm/contest/75/D


题目描述

小牛和小客玩石子游戏,他们用n个石子围成一圈,小牛和小客分别从其中取石子,谁先取完谁胜,每次可以从一圈中取一个或者相邻两个,每次都是小牛先取,请输出胜利者的名字(小牛获胜输出XiaoNiu,小客获胜输出XiaoKe)(1 2 3 4 取走 2 13 不算相邻)


输入描述:

输入包括多组测试数据
每组测试数据一个n(1≤n≤1e9)

输出描述:

每组用一行输出胜利者的名字(小牛获胜输出XiaoNiu,小客获胜输出XiaoKe)
示例1

输入

2
3

输出

XiaoNiu
XiaoKe


解析:

这道题是一道简单的巴什博奕变形题,代码不难,难的是思想。这里每次都是小牛先取,倘若n小于等于2,小牛只需要把所有石子一次性取完便获胜。倘若 n == 3,小牛取1颗小客取2颗,小客胜;小牛取2颗小客取1颗,小客胜。倘若 n == 4,小牛取1颗,小客取斜对脚的1颗使剩余两颗不相邻,再然后小牛1颗,小客1颗,小客胜;小牛取两颗,小客取剩下两颗石子,小客胜。。。  由此可见,当 n > 3 时,只要小客第一次取时使剩余石子分为两堆,剩余石子按照小牛的取法镜像操作(小牛怎么取,小客便对应取和小牛相同数量的石子),那么最终一定是小客胜。故,当 n 小于等于2 时小牛胜,当 n > 2 时小客胜。


代码实现:

import java.util.Scanner; 
public class Main {    
    public static void main(String[] args) {  
        Scanner input = new Scanner(System.in);
    	while(input.hasNextInt()) {
            int n = input.nextInt();
        	if (n > 2)
            	System.out.println("XiaoKe");
       		else 
            	System.out.println("XiaoNiu");
        }
    }  
}

判题结果如下:





相关链接:https://github.com/striner/javaCode/blob/a53e456ab340900195dc39705997ff700e29fe30/%E5%B7%B4%E4%BB%80%E5%8D%9A%E5%BC%88%E5%8F%98%E5%BD%A2%E4%B9%8B%E5%8F%96%E7%9F%B3%E5%AD%90






猜你喜欢

转载自blog.csdn.net/striner/article/details/79381646