zoukankan      html  css  js  c++  java
  • 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");
    		}
    	}
    
    }
    
    
  • 相关阅读:
    tool公用工具方法
    angular5.x 拦截器 switchMap
    angular5.x拦截器 给get post请求添加参数user_token
    flex布局 阮一峰
    json.stringify()和json.parse()
    年份月数天数
    打印字母塔
    打印形状
    打印九九乘法表
    C语言猜数字游戏
  • 原文地址:https://www.cnblogs.com/1pha/p/8453561.html
Copyright © 2011-2022 走看看