博弈小结

1.巴什博弈:

有n粒石子,每次最多取m个,俩个人都不傻,问谁会胜;

n=m+1时,先手(先取的那一个)必败,因为他最少取一个,剩下的数量肯定是不大于m的,那么第二个人可以一次性取完。

依照这个原理,在取的过程中,可以每次都给对手恰好留够(m+1)个石子,这时对方一定取不完,但是己方一定可以取完(只要不傻)。也就是k=n%(m+1)若k不等于0,说明你下一步可以把k*(m+1)之外的取光,留给对手(m+1)的倍数个石子,必赢

另一种情况,就是局势已经是(m+1)的倍数个石子了,只要对方不傻,每次都给你留(m+1)的倍数个,你必输。

2.尼姆博奕:

在了解尼姆博弈之前,先了解一下二进制中的异或运算。

所谓异或运算,就是在所有数均化为二进制之后的一种运算,并且是八位,正数不够补零,(负数不够补一),

举个例子:4的二进制是100,八位之后便是00000100;在此基础上介绍异或运算,异或运算又名(+),为什么这样说呢,因为它只加却不进位,比如7异或3,即111(+)011,结果是100,就是1(+)1=0,1(+)0=1;独特的加法运算。

接下来便是尼姆博弈,有n堆石子,每次可以取一堆,或者是一堆中的一部分,谁先取完谁胜。

这里提到奇异局势,就是无论哪一方面对奇异局势最终都会败。比如当n=3时,描述其中一种奇异局势(0,0,0);

是不是谁面对它都必败(嘿嘿,咱继续),(0,x,x)也是,信不?我取x,他取x,然后我败,,也就是说,谁面对奇异局势,必败。

这个时候,为了胜出,所以就要千方百计的让对方面对奇异局势。

也就是你要在这堆里取某个特定的数目,使其变为奇异局势。假设这个数目为p;

怎么求p呢,这前人的智慧就显得至关重要了,

尼姆老大爷就给我们总结了:

任何奇异局势(a,b,c)都有a (+)b(+) c =0。假设要在c中取石子,那就p=c--a(+)b,(如果c<p,那就换从a或者b中取呗),在此之前,有必要了解一点,一个数异或它自身,结果是0.

3.斐波那契博弈:

有一堆个数为n的石子,游戏双方轮流取石子,满足:

1)先手不能在第一次把所有的石子取完;

2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。

约定取走最后一个石子的人为赢家,求必败态。

必败n必须符合斐波那契;

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<cmath>  
#include<vector>  
#include<string>  
#include<map>  
#define LL long long  
#define N 1000000  
#define inf 1<<20  
using namespace std;  
int fib[50];  
int main(){  
    fib[0]=1;fib[1]=2;  
    for(int i=2;i<45;i++)  
        fib[i]=fib[i-1]+fib[i-2];  
    int n;  
    while(scanf("%d",&n)!=EOF&&n){  
        int i=0;  
        for(i=0;i<45;i++)  
            if(fib[i]==n)  
                break;  
        if(i<45)  
            puts("Second win");  
        else  
            puts("First win");  
    }  
    return 0;  
}  

4.威佐夫博弈:

有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜.

重点:

奇异局势下先手必败,非奇异局势下先手必胜;

类似于尼姆博弈的奇异局势,(a,b),怎么判断是不是奇异局势呢?

两堆物品个数分别为a,b(a<b),则k=b-a,再判断a是否等于[(b
-a)*( √5+1)/2] 即可得知是否是奇异局势。


5.Nim Staircase博奕:

这个问题是尼姆博弈的拓展:游戏开始时有许多硬币任意分布在楼梯上,共n阶楼梯从地面由下向上编号为0到n。游戏者在每次操作时
可以将楼梯j(1<=j<=n)上的任意多但至少一个硬币移动到楼梯j-1上。游戏者轮流操作,将最后一枚硬币移至地上(0号)的人获胜。

算法:

将奇数楼层的状态异或,和为0则先手必败,否则先手必胜:

不会证明。。。。。。。(TJT).....









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值