其实规律很好找的,当从某点开始,向某一边找出非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 }