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\n"); 42 else printf("Ollie wins\n"); 43 } 44 }