博弈论

巴什博奕(Bash Game)

有1堆含n个石子,两个人轮流从这堆物品中取物,规定每次至少取1个,最多取n个。取走最后石子的人获胜。

石子总数 % (n + 1) != 0, 先手必胜

如果为1~n+1的石子时,如何取都先手必输,如果大于n+1,先手可以使次状态转换为n+1个石子

题目

杰哥和洛姐在玩游戏,他们在玩经典的石子游戏。现在有三堆石子,分别有 n0,n1,n2个石子,杰哥和洛姐轮流进行游戏。

每次游戏将同时从三堆石子中分别拿走 x0,x1,x2个石子,满足 x0∈ [1,3],x1∈[1,4],x2∈[1,5]​,保证石堆中石子数量时刻为非负整数。

当一个人在任意一堆中无法拿走石子(即石堆中,有至少一堆的余量为0),他将输掉游戏。

洛姐先手杰哥后手。洛姐想知道,她能否战胜博弈天才杰哥。(双方都使用最优策略进行游戏)

输入描述:

多组输入,第一行输入 t,表示样例数量。(1≤t≤10^6)

接下去t行每行输入三个正整数 n0,n1,n2,表示三堆石子的初始数量。(0≤n0,n1,n2≤10^9)

输出描述:

洛姐获胜,则输出一行字符串 (^-^) (不包含引号)。

否则输出一行字符串 (T-T) (不包含引号)。



代码:


题目相当于同时进行了三场巴什博弈,但是石子数量不同,所取的范围也不同,所以洛姐只要在最快结束的那一场胜利即可。

#include<bits/stdc++.h>
using namespace std ;

int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t; cin >> t;
    while(t --){
        int n0, n1, n2; cin >> n0 >> n1 >> n2;
        int a = n0/4*2, b = n1/5*2, c = n2/6*2;//*2保证必是偶数
        if(n0%4)a++;//如果满足先手胜利条件,+1后必是奇数
        if(n1%5)b++;
        if(n2%6)c++;
        int ans = min({a, b, c});//        int ans = min(a, min(b,c));
        if(ans & 1) cout << "(^-^)\n";
        else cout <<"(T-T)\n";
    }
    return 0;
}

尼姆博奕(Nim Game)

有石子数各异的k堆石子,两个人轮流从某一堆中取石子,至少取一个,多者不限。取走最后石子的人获胜。

xor(异或操作)满足交换律,结合律,消去律,并且与自己本身互为逆运算。

求异或和,初值应为0, 与0异或原本是0的值就是0, 是1 的值就是 1


posted @ 2022-07-19 20:47  每日一题,医生远离  阅读(133)  评论(0)    收藏  举报