Problem Description
Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser of the two numbers from the greater of the two numbers, provided that the resulting number must be nonnegative. Then Ollie, the second player, does the same with the two resulting numbers, then Stan, etc., alternately, until one player is able to subtract a multiple of the lesser number from the greater to reach 0, and thereby wins. For example, the players may start with (25,7):
25 7
11 7
4 7
4 3
1 3
1 0
an Stan wins.
Input
The input consists of a number of lines. Each line contains two positive integers giving the starting two numbers of the game. Stan always starts.
Output
For each line of input, output one line saying either Stan wins or Ollie wins assuming that both of them play perfectly. The last line of input contains two zeroes and should not be processed.
Sample Input
34 12
15 24
0 0
Sample Output
Stan wins
Ollie wins
来自 <http://acm.hdu.edu.cn/showproblem.php?pid=1525>
1: 这道题的思路就是找到必胜点,然后判断这个必胜点是先手拿到还是后手拿到。
2:这道题的必胜点有两种情况:
(1) 就是m>=2*n;(因为编写了一个maxchange函数,所以m一直大于n,便于操作)
(2) 就是相减过程中 m n中有一个变成了 1;
所以接下来就是用代码实现这个思路:
#include<stdio.h>
#include<stdlib.h>
void maxchange(int *a,int *b){
int t;
if(*a<*b){
t=*a;
*a=*b;
*b=t;
}
}
int main (){
int m,n,sum;
while(~scanf("%d%d",&m,&n)&&(m||n)){
maxchange(&m,&n);
sum=0;
if(!(m-n)){
printf("Stan wins\n");//这种写法有一个特殊点必须单独考虑就是m和n相等的情况
continue;
}
while(m/n<2&&(m!=1)&&(n!=1)){//找必胜点,并判断是先手玩家还是后手玩家走到这点。
m-=n;
maxchange(&m,&n);
sum++;
}
if(sum%2==0)
printf("Stan wins\n");
else
printf("Ollie wins\n");
}
return 0;
}

本文探讨了两人游戏中的博弈策略,通过实例分析了如何确定游戏的必胜点,并判断哪个玩家能在完美策略下获胜。提供了具体的代码实现,展示了如何在游戏过程中交替减少数值,直至一方达到胜利条件。
5630

被折叠的 条评论
为什么被折叠?



