博弈论

Nim游戏

No.1 有N堆石子。A B两个人轮流拿,A先拿。每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜。给出N及每堆石子的数量,问最后谁能赢得比赛。

1
a[1]^a[2]^...^a[N]==0?"B":"A";

Bash游戏

No.1 有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。给出N和K,问最后谁能赢得比赛。

1
2
if(N%(K+1))cout<<"A"<<endl;
else cout<<"B"<<endl;
No.2 有一堆石子共有N个。A B两个人轮流拿,A先拿。每次只能拿1,3,4颗,拿到最后1颗石子的人获胜。给出N,问最后谁能赢得比赛。
1
2
if(N%7==0||N%7==2)cout<<"B"<<endl;
else cout<<"A"<<endl;
No.3* 有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量只能是2的正整数次幂,比如(1,2,4,8,16....),拿到最后1颗石子的人获胜。给出N,问最后谁能赢得比赛。
1
2
if(N%3)cout<<"A"<<endl;
else cout<<"B"<<endl;
NO.4 有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量最少1个,最多不超过对手上一次拿的数量的2倍(A第1次拿时要求不能全拿走)。拿到最后1颗石子的人获胜。给出N,问最后谁能赢得比赛。
1
2
if(fibonacci(N))cout<<"B"<<endl;
else cout<<"A"<<endl;

威佐夫游戏

No.1 有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。给出2堆石子的数量,问最后谁能赢得比赛。

1
2
if((b-a)*(sqrt(5)+1)/2==a)cout<<"B"<<endl;
else cout<<"A"<<endl;//b>a