hdu 4559 涂色游戏 博弈论

构造SG函数:sg[i]表示2*i的sg值!!

代码如下:

 

 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<algorithm>

 4 #include<iomanip>

 5 #include<cmath>

 6 #include<cstring>

 7 #include<vector>

 8 #define ll __int64

 9 #define pi acos(-1.0)

10 #define MAX 5000

11 using namespace std;

12 int an[2][MAX],sg[MAX];

13 bool vis[MAX];

14 int getsg(int x)

15 {

16     int i;

17     if(sg[x]>=0) return sg[x];

18     memset(vis,0,sizeof(vis));

19     for(i=0;i<=x-i-1;i++)

20         vis[getsg(i)^getsg(x-i-1)^1]=1;

21     for(i=0;i<=x-i-2;i++)

22         vis[getsg(i)^getsg(x-i-2)]=1;

23     i=0;

24     while(vis[i]) i++;

25     return sg[x]=i;

26 }

27 int main(){

28     int t,m,n,s,c,ans,i,k=0,len;

29     memset(sg,-1,sizeof(sg));

30     sg[0]=0;

31     for(i=1;i<=4747;i++) sg[i]=getsg(i);

32     scanf("%d",&t);

33     while(t--){

34         scanf("%d %d",&n,&m);

35         memset(an,0,sizeof(an));

36         for(i=0;i<m;i++){

37             scanf("%d %d",&s,&c);

38             an[s-1][c-1]=1;

39         }

40         ans=0;len=0;

41         for(i=0;i<n;i++){

42             if(an[0][i]||an[1][i]){

43                 ans^=sg[len];

44                 ans^=an[0][i];

45                 ans^=an[1][i];

46                 len=0;

47             }

48             else len++;

49         }

50         ans^=sg[len];

51         printf("Case %d: %s\n",++k,ans?"Alice":"Bob");

52     }

53     return 0;

54 }
View Code

 

 

 

你可能感兴趣的:(HDU)