几个博弈

来源:互联网 发布:centos chrome 安装包 编辑:程序博客网 时间:2024/05/16 01:38

POJ 1067-取石子游戏
题意:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

while ( scanf( "%d%d", &a, &b ) )                    if ( a > b )    {                            t = a;      a = b;      b = t;   }    d = b - a;    t = floor( d * ( sqrt(5.0) + 1 ) / 2 );    puts( (t == a) ? "0" : "1" );

POJ 1740-A New Stone Game
题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。最后谁无子可取即输。

    while (scanf("%d", &n), n)    {        memset(count, 0, sizeof(count));        for (i = 0; i < n; ++i)        {            scanf("%d", &m);            ++count[m];        }        for (i = 1; i <= maxn; ++i)        {            if (count[i] & 1)                break;        }        printf("%d\n", i != maxn+1);    }

POJ 1704-Georgia and Bob
题意:n个位置有东西,然后现在每次要把这些东西向左移动,只能移动到最左边或者被其他东西挡住的位置,谁先无法移动就输,问最后谁赢
思路:转化为Nim游戏,首先相邻的两个作为1组,如果是奇数,就第一个和0作为1组,然后如果移动每组的前一个棋子,其实是没有影响的,因为后手可以跟他一样,把后面的棋子移动一样的步数,而移动后手,相当于把一个区间缩短,这样一个区间的长度就等同于Nim游戏中石子的数量,转化为了Nim游戏
POJ 1082-Calendar Game

POJ 2311-Cutting Game
题目:两个人轮流剪纸片,直到有一个人剪出1*1的方格就算这个人赢了。然后给出纸片的长和宽,求先手会赢还是会输

int get_sg(int n,int m){    if(sg[n][m]!=-1) return sg[n][m];    int vis[maxn];    memset(vis,0,sizeof(vis));    for(int i=2;i<=n-i;i++)        vis[get_sg(i,m)^get_sg(n-i,m)]=1;    for(int i=2;i<=m-i;i++)        vis[get_sg(n,i)^get_sg(n,m-i)]=1;    for(int i=0;;i++)        if(vis[i]==0)          return sg[n][m]=i;}

POJ 2312 Battle City

HDU 1079 Calendar Game

HDU 1525 Euclid’s Game
题意:题目给出了两个正数a.b,每次操作,大的数减掉小的数的整数倍。一个数变为0 的时候结束。谁先先把其中一个数减为0的获胜。问谁可以赢。

 while(n>0&&m>0)        {            if(n<m)  swap(n,m);            if(n%m==0) break;            if(n-m>m) break;            n=n-m;            flag=!flag;        }        if(flag)        {           printf("Stan wins\n");        }        else        {           printf("Ollie wins\n");        }

HDU 1564 Play a game
题意:给定一个n*n的表格,在一个角上放入一块石头,然后两个人轮流移动石头,只能水平和竖直移动石子,而且不能移到已经访问的格子,最后没法移动的玩家为输者。

  while(t--)    {        int n,m;        scanf("%d%d",&n,&m);        if(n%(m+1)==0)            printf("second\n");        else            printf("first\n");    }

HDU 1847 Good Luck in CET-4 Everybody!
题意:总共n张牌,双方轮流抓牌,每人每次抓牌的个数只能是2的幂次,最后抓完牌的人为胜者。

HDU 2897 邂逅明下
题意:给出硬币的个数,每人轮流取,最少取p个,最多取q个,最后取的人就输了
思路:最主要是判断最后剩下的硬币的个数就是了,由于是问是否有必胜的策略,所以当轮到A是剩下的硬币0<=K<=p则A胜否则B胜利
N = (p+q)*r+k
A胜:假设第一次A取T个,则以后每次B取X个,A就取(p+q-x)个,剩下的只要q

a=0,b=0;for(int i=0;i<n;i++){    scanf("%I64d%I64d",&x,&y);     while(x>1&&y>1)    {       x=x>>1;       y=y>>1;    }    if(x==1) b+=y-1;    else a+=x-1; }printf(a>b?"Alice\n":"Bob\n");

HDU 3863 No Gambling
第一个人从左到右连接蓝点,第二个人从上到下连接红点,轮流进行,看最后谁的线最多则赢,只要是先手,那么连的线一定是最多了。

HDU 2176 取(m堆)石子游戏

HDU 2177 取(2堆)石子游戏

0 0
原创粉丝点击