博弈论
第一次写博客,以后加油吧
参考链接
参考链接
何为博弈论
那就是若有多个人进行博弈,假设他们都足够聪明(能力已经相当于计算机了),在他们都没有失误并采取最优策略后,一定有一个人胜出,在知道初状态及规则的情况下,求解最终必胜的初状态(即何人胜出)的一类问题的理论及方法。
题型
1:有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。
一、巴什博弈(Bash Game)
只有一堆n个物品,两个人从轮流中取出(1~m)个;最后取光者胜。
考虑到 若n=m+1 那么 第一个人不论如何取都不能取胜。
进一步我们发现 若 n=k*(m+1)+r; 先取者拿走 r 个,那么后者再拿(1~m)个
n=(k-1)(m+1)+s; 先取者再拿走s 个 最后总能造成 剩下n=m+1 的局面。
因此,此时先手有必赢策略。
相对应的,若n=k(m+1) 那么先取者必输。
因此我们可以写出对应的程序(默认 n m都大于0)
必胜策略:令 n = (k + 1) * r + s ; A第一次取s个,让B面对k+1倍数的局面,如果B取m个则A取k+1 - m个。
代码如下
在这里插入代码片
#include"stdio.h"
#include"string.h"//jiandanboyilun
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int</