UVA 12293 Box Game 组合游戏/SG定理+找规律
来源:互联网 发布:java finally 抛异常 编辑:程序博客网 时间:2024/05/16 15:21
#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>using namespace std;int sg[202];//sg[i]表示连续的x个空格子组成的棋盘的SG值int vis[202];void init()//SG定理{int i,j,k;sg[1]=0;sg[2]=1;for(i=3;i<=200;i++){memset(vis,0,sizeof(vis));for(j=(i+1)/2;j<i;j++) vis[sg[j]]=1;for(j=0;j<=200;j++) if(!vis[j]) { sg[i]=j; break; }}for(i=1;i<=50;i++) cout<<i<<":"<<sg[i]<<endl; //输出前50个数的SG值,可发现,只有当n=2^i-1是,SG函数值是0,即必败}int main(){ //init(); int n; while(cin>>n) { if(n==0) break; n++; while(n!=1) { if(n%2==0) n=n/2; else break; } if(n==1) cout<<"Bob"<<endl; else cout<<"Alice"<<endl; } return 0;}/*题意:有两个盒子,一个n,另一个1,Alice(先)和Bob轮流,每次删去较小值,并分较大值为两个正整数放入两个盒子,不能分者为负。方法:由于n太大,不能直接用SG定理,可用SG定理输出SG函数,查看规律。SG状态:每次只删去较小值。所以可以认为从n开始,每次n都变为(n+1)/2~n-1中的一个,即较小值会被删去, 所以只用讨论n逐次分出的较大值,直到较大值为1时。*/