HDU 1527 2177(威佐夫博奕)

来源:互联网 发布:微店和淘宝的付款方式 编辑:程序博客网 时间:2024/06/04 20:04

有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。

分析:假设两堆石子的数量分别用m,n来表示,(m,n);m

#include<cstdio>#include<algorithm>#include<cmath>using namespace std;int main(){    int ak,bk,k;    while(scanf("%d%d",&ak,&bk)!=EOF)    {        if(ak>bk)            swap(ak,bk);        int temp=(bk-ak)*(sqrt(5.0)+1)/2;        if(temp==ak)  printf("0\n");        else    printf("1\n");    }    return 0;}

2177 在1527的基础上增加了,必胜时输出第一次取完后,两堆石子剩余的情况。因为有两种取法,我们只要分两种情况。1、同时从两堆中取相同的数目,只需要1-m遍历一遍,筛选符合条件的取法 ;2、从一堆中取,从1-n,遍历进行筛选

#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int boyi(int x,int y){    int t=(y-x)*(sqrt(5.0)+1)/2;    if(t==x)        return 0;    else        return 1;}int main(){    int a,b,x,y,m,n;    while(scanf("%d%d",&a,&b),a&&b)    {        if(a>b)            swap(a,b);        printf("%d\n",boyi(a,b));        if(boyi(a,b)){            for(int i=1;i<=a;i++){//同时从两堆中取                x=a-i;  y=b-i;                 if(!boyi(x,y)){//只需使剩下的是奇异局势,即留给对方的是必败态,那么自己总面对的必胜态                printf("%d %d\n",x,y);                break;                }           }            for(int i=1;i<=b;i++){//从一堆中取                int t=b-i;                m=(a>t)?t:a;                n=(a>t)?a:t;                if(!boyi(m,n)){//同上                    printf("%d %d\n",t,a);                    break;                }            }        }    }    return 0;}
0 0
原创粉丝点击