POJ 1704 Georgia and Bob(阶梯博弈+证明)
关于阶梯博弈有如下定理:
将所有奇数阶梯看作n堆石头,做Nim,将石头从奇数堆移动到偶数堆看作取走石头,同样地,异或值不为0(利己态)时,先手必胜。
以下是POJ 1704的AC代码:
//棋子只能往左走(最左有界线),可以走任意多格(>=1) //而且棋子不能越过在它前面的棋子(它左边的棋子) //每个格最多放一个棋子,说明棋子也不能走到另一个棋子所在的位置 //转换成nim:把输入的位置排好序,算相邻两点的间距,该间距就是最多能走的步数k,看作一堆里的k个石子 //然后从最大的位置(因为最右)开始遍历,计算奇数堆的nim异或值 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int main() { int t; scanf("%d",&t); while(t--) { int sum=0,n,a[1005],b[1005]; scanf("%d",&n); a[0]=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a,a+n+1); for(int i=1;i<=n;i++) b[i]=a[i]-a[i-1]-1; int cnt=0; for(int i=n;i>0;i--) { cnt++; if(cnt&1) sum^=b[i]; } if(sum) printf("Georgia will win\n"); else printf("Bob will win\n"); } return 0; }