zoj 2686 Cycle Game 博弈论

其实规律很好找的,当从某点开始,向某一边找出非0的个数,为奇数时必胜。

代码如下:

 

 1 #include<iostream>

 2 #include<cstdio>

 3 using namespace std;

 4 int n,a[25];

 5 bool dfs(int m)

 6 {

 7     int cnt=0,i=m,k;

 8     while(a[i]) i=(i+1)%n,cnt++;

 9     if(cnt&1) return 1;

10     i=(m+n-1)%n;cnt=0;

11     while(a[i]) i=(n+i-1)%n,cnt++;

12     if(cnt&1) return 1;

13     for(int i=-1;i<=1;i+=2){

14         if(i==1) k=m;

15         else k=(m+n-1)%n;

16         for(int j=1;j<=a[k];j++){

17             a[k]-=j;

18             if(!dfs((n+i+m)%n)){

19                 a[k]+=j;

20                 return 1;

21             }

22             a[k]+=j;

23         }

24     }

25     return 0;

26 }

27 int main()

28 {

29     int t;

30     cin>>t;

31     while(t--){

32         cin>>n;

33         for(int i=0;i<n;i++) cin>>a[i];

34         puts(dfs(0)?"YES":"NO");

35     }

36     return 0;

37 }
View Code

 

 

 

你可能感兴趣的:(game)