博弈论
巴什博奕(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

浙公网安备 33010602011771号