博弈论------白书

poj2484

两枚硬币排成一个圈,alice和bob轮流从中取一枚或者两枚硬币。不过,取两枚时,所取的硬币必须是连续的。硬币取走后留下空位,相隔空位的硬币被视为是不连续的。alice开始先取,取走最后一枚硬币的一方获胜。当双方都采取最优策略,谁会获胜。

输入(硬币的个数)(0<=n<=1000000)

输出 赢的人的姓名

首先n的范围过大,不适合采用sg函数打表的方式,如果打表的话,会超时或者超空间,而且最重要的一点是圆排列的变化会有很多

然后圆上有一个对称的特点,可以围绕这个对称的特点展开文章,当对手取走一部分时,你可以取走对称部分的相对应的圆排列,这样可以保证后手必赢,而且有一点可以保证的就是到为奇数的时候,当第一次对手取2个,你可以通过取1个变成对称的情况,而对手取1个,你可以取两个

 1 #include<cstring>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstdio>
 5 using namespace std;
 6 int n;
 7 int main(){
 8     while(scanf("%d",&n)!=EOF){
 9         if(n==0) break;
10         if(n==1||n==2) printf("Alice\n");
11         else printf("Bob\n");
12     }
13     return 0;
14 }

猜你喜欢

转载自www.cnblogs.com/pandaking/p/9901782.html