DU1525 Euclid's Game 博弈

HDU1525 Euclid's Game 博弈

题意

给定两个数字 a, b. 每次只能用 较大的值 减去 较小的值的倍数, 两个人轮流进行操作, 第一个得到 0 的胜利.

分析

  • 对于 a == b 和 a % b == 0 的状态, 则先手一定获胜
  • 对于 a > 2 * b 的情况, 因为, 在 (a, b) 的情况下, 先手为绝对聪明,
    1. 若他知道 (a % b, b) 为必败态, 则可以转移到 (a % b, b) , 把这个状态留给对手

    2. 若他知道 (a % b, b) 为必胜态, 则可以转移到 (a % b + b, b), 则对手只能将这个状态变为 (a % b, b) 这个必胜态留给自己.

  • 当 a 在 (b, 2b) 时, 无法确定状态, 因此, 将 a -= b 转移到上述两个状态进行求解

代码

package 博弈;

import java.util.Scanner;

public class HDU1525 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()) {
			int a = in.nextInt();
			int b = in.nextInt();
			if(a == 0 && b == 0)
				break;
			if(a < b) {
				int temp = a; a = b; b = temp;
			}
             // flag变量用来确认 当游戏结束时间, Stan 是否为先手
			boolean flag = true;
			while(0 != b) {
				if(a % b == 0 || a > 2 * b) {
					break;
				}
				a -= b;
				{int temp = a; a = b; b = temp;}
				flag = !flag;
			}
			if(flag)
				System.out.println("Stan wins");
			else
				System.out.println("Ollie wins");
		}
	}

}

原文地址:https://www.cnblogs.com/1pha/p/8453561.html