zoukankan      html  css  js  c++  java
  • Openjudge-计算概论(A)-取石子游戏

    描述:

    有两堆石子,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍.最后谁能够把一堆石子取空谁就算赢. 
    比如初始的时候两堆石子的数目是25和7 

    25 7 --> 11 7 --> 4 7 --> 4 3 --> 1 3 --> 1 0
      选手1取   选手2取   选手1取   选手2取   选手1取


    最后选手1(先取的)获胜,在取的过程中选手2都只有唯一的一种取法。 
    给定初始时石子的数目,如果两个人都采取最优策略,请问先手能否获胜。

    输入输入包含多数数据。每组数据一行,包含两个正整数a和b,表示初始时石子的数目。
    输入以两个0表示结束。输出如果先手胜,输出"win",否则输出"lose"

    样例输入

    34 12
    15 24
    0 0

    样例输出

    win
    lose

    提示:假设石子数目为(a,b)且a >= b,如果[a/b] >= 2则先手必胜,如果[a/b]<2,那么先手只有唯一的一种取法.
    [a/b]表示a除以b取整后的值.

    思路:这题虽然是归类在函数与递归里面,但其实可以不用递归,递归可能会超时,具体怎么做提示里面已经给的很清楚了,这里就不用多解释了。

    代码如下:

     1 #include<stdio.h>
     2 int main()
     3 {
     4     int a,b;
     5     int t,f,c;
     6     scanf("%d%d",&a,&b);
     7     while(a!=0&&b!=0)
     8     {
     9         if(a<b)//如果第一堆比第二堆少,交换,保证是先取多的那堆 
    10         {
    11             t=a;a=b;b=t;
    12         }
    13         f=1;//1表示选手赢,-1表示选手1输。
    14         while((c=a/b)==1&&(a%b!=0))
    15         {
    16             t=a%b;
    17             a=b;
    18             b=t;
    19             f=-f;
    20         }
    21         if(f==1)  printf("win
    ");
    22         else printf("lose
    ");
    23         scanf("%d%d",&a,&b);
    24     }
    25     return 0;
    26 }
    我不怕千万人阻挡,只怕自己投降…
  • 相关阅读:
    python 迭代器
    python 语言特性
    JavaScript 【语句】for-in语句
    Vue实例-创建第一个VUE应用
    【安装】Vue( 直接使用<script>方式引入、CDN方式引入 )
    到某个目录下新建文件
    NVM 安装( Windows)
    尾调用
    JavaScript 【函数表达式】私有变量
    JavaScript 【函数表达式】模仿块级作用域
  • 原文地址:https://www.cnblogs.com/geek-007/p/4296743.html
Copyright © 2011-2022 走看看