hdu 1517 A Multiplication Game(博弈找规律)

来源:互联网 发布:长庚医院网络挂号预约 编辑:程序博客网 时间:2024/05/22 12:47

1  2-----9 、  (9+1) ------- (2*9)、(2*9+1) ------- (2*9*9) 、(2*9*9+1) ------ (2*9*9*2)、(2*9*9*2+1) ------(2*9*9*2*9) ......

     N                          P                                  N                                      P                                           N

      S                         O                                 S                                      O                                           S

     *9                        *2                                 *9                                      *2                                          *9


P为必败点(下一个选手获胜),N为必胜点(上一个选手获胜)。

这里P、N的划分:

   一段N点的最后 *2 是因为P点无论哪种方案到达N点,例如点2*9,就是最后一个可由2乘以9得到的数,一旦大于2*9,则由点2就绝对不能通过乘以2----9的某个数达到(不能满足P的属性)。

   一段P点的最后 *9 是因为N点至少有一种方案到达P点,例如 2*9*9 ,只有2*9通过乘以9得到满足条件的数,一旦大于 2*9*9 ,则所有前一个N段中的数都不能通过乘以2-----9的某个数得到满足条件的数,即>=2*9*9+x (x>0)。(不能满足N的属性)

所以,以每段最后一个数作为判断标准。

代码:

#include<iostream>#include<string.h>using namespace std;int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        if(n>=1 && n<=9) {printf("Stan wins.\n"); continue;}        bool flag=true;        int temp=1;        while(temp<n)        {            if(flag)            {                temp*=9;                flag=false;            }            else             {                temp*=2;                flag=true;            }        }        if(flag) printf("Ollie wins.\n");        else  printf("Stan wins.\n");    }    return 0;}


原创粉丝点击