zoukankan      html  css  js  c++  java
  • poj 2348 Euclid's Game(博弈)

     1 /*********************************************************
     2 题意:       有两个人玩游戏,比如有两个堆石头,一个人只能
     3               在多的那堆石头里取,并且只能取少的那堆石头里
     4               整数倍的石头。给出两堆石头的数量,两人轮流取,
     5               谁先取完其中一堆石头则胜利,并且stan先取,要
     6               给出胜利人的名字
     7               
     8 算法:        博弈
     9 
    10 解题思路:    假设一个这样的状态T1=(x,y),并且x>y,那么状态
    11               T2=(x+y,y)可以到达T1,并且两者之间一个为必胜状态,
    12               那么另外一个为必败状态但是,T3=(x+2y,y)既可以到
    13               达T1状态,又可以到达T2状态,那么我们可以说T3状态
    14               是一个必胜状态,同理T4=(x+3y,y),...(x+4y,y)等几个
    15               状态,也同样可以到达T1与T2状态,那么这些状态也为
    16               必胜状态所以我们说如果满足x>=2y,则为必胜状态,如
    17               果是y<x<2y,这种情况,下个状态只能为(x-y,y),为了保
    18               证前面一个数大于后面一个数,我们会将两者交换x不可
    19               能小于y,因为前提假设了x>y如果x==y,或者x=0或者y=0,
    20               那么当前取石子的人胜利
    21 ***********************************************************/
    22 #include<cstdio>
    23 #include<cstring>
    24 #include<algorithm>
    25 #include<iostream>
    26 using namespace std;
    27 
    28 int dfs(int n,int m,int p)
    29 {
    30     if (n%m==0||n-m>m) return p;         ///此处n-m>m一定不能写成n>m*2
    31     if (n-m<m) return dfs(m,n-m,p^1);
    32 }
    33 
    34 int main()
    35 {
    36     int n,m;
    37     while (~scanf("%d%d",&n,&m)&&m+n)
    38     {
    39         if (n<m) swap(n,m);
    40         int flag=dfs(n,m,1);
    41         if (flag) printf("Stan wins
    ");
    42         else printf("Ollie wins
    ");
    43     }
    44 }
  • 相关阅读:
    POJ3662 Telephone Lines (dijkstra+二分)
    Codeforces Round #618 (Div. 2)A. Non-zero
    Codeforces Round #618 (Div. 2)C. Anu Has a Function
    洛谷P1060开心的金明(滚动数组优化)
    洛谷P1006传纸条
    Spring Boot中以代码方式配置Tomcat
    js常用方法总结(以后遇到再进一步总结)
    localStorage的使用
    巧用Ajax的beforeSend 提高用户体验
    四种会话跟踪技术
  • 原文地址:https://www.cnblogs.com/pblr/p/5708780.html
Copyright © 2011-2022 走看看