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时。*/

原创粉丝点击