Ferguson博弈

清空/分割游戏也叫做Ferguson博弈。


进行游戏需要用到两个盒子,在游戏的开始,第一个盒子中有n枚石子,第二个盒子中有m个石子(n, m > 0)。参与游戏的

名玩家轮流执行这样的操作:清空一个盒子中的石子,然后从另一个盒子中拿若干石子到被清空的盒子中,使得最后两个

盒子都不空。当两个盒子中都只有一枚石子时,游戏结束。最后成功执行操作的玩家获胜。找出游戏中所有的P位置。


结论:对于一个位置(x, y)来说,如果x, y中有一个偶数,那么(x, y)是N(必胜)位置。如果x和y都是奇数,那么

(x, y)是P位置(必败),可以用数学归纳法证明。


证明:

证明结论:(x,y)至少一偶时,先手胜;都为奇时,先手败


证明:

(x,y)=(1,1)时是先手必败态,下对max(x,y)>1进行归纳

1、当max(x,y)=2时,即(x,y)=(1,2)或(2,1)或(2,2),先手留下一个2分为(1,1),先手获胜。

即当max(x,y)=2时结论成立。


2、假设max(x,y)<k时结论都成立,现证max(x,y)=k时结论成立。

若(x,y)中有一个偶数(设为a),先手将另一个清空,把偶数a分为两个奇数b和c,由于b、c<a 小于等于 k,即

max(b,c)<k,由假设,在(b,c)位置上后手作为新先手必败,故先手胜。

若(x,y)都为奇数,先手只能保留一个奇数并将其分解为一奇a一偶b,由于max(a,b)<max(x,y)=k,由假设,在(a,b)位

置上后手作为新先手必胜,故先手败。


经典题目:http://acm.hdu.edu.cn/showproblem.php?pid=2147



题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3714


题意:本题与清空/分割游戏不同的是,每次清空球较少的那个盒子,而清空/分割游戏是清空任意一个盒子,不管球的个数多少,其它条

件都相同。


分析:本题就是找规律,可以发现就是判断n+1是否是2的整数次幂,那么用(n & ( n + 1 )) == 0来判断就行了。


暴力程序:


#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N = 105;

bool dp[N][N];
bool vis[N][N];

bool dfs(int n,int m)
{
    if(n == 1 && m == 1) return 0;
    if(vis[n][m]) return dp[n][m];
    for(int i=1; i<=n/2; i++)
    {
        dp[n-i][i] = dfs(n-i,i);
        vis[n-i][i] = 1;
    }
    for(int i=1; i<=n/2; i++)
    if(!dp[n-i][i]) return 1;
    return 0;
}

int main()
{
    memset(dp,0,sizeof(dp));
    memset(vis,0,sizeof(vis));
    for(int i=1;i<65;i++)
        cout<<dfs(i,1)<<" ";
    cout<<endl;
    return 0;
}

结论:如果(n & (n + 1)) == 0,那么先手败,否则先手胜。


#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main()
{
    int n;
    while(cin>>n)
    {
        if(n == 0) break;
        if((n & (n + 1)) == 0) puts("Bob");
        else puts("Alice");
    }
    return 0;
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值