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
原文地址:https://www.cnblogs.com/xin-hua/p/3330817.html