您的位置:首页 > 其它

zoj 2686 Cycle Game 博弈论

2013-09-20 21:47 330 查看
其实规律很好找的,当从某点开始,向某一边找出非0的个数,为奇数时必胜。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[25];
bool dfs(int m)
{
int cnt=0,i=m,k;
while(a[i]) i=(i+1)%n,cnt++;
if(cnt&1) return 1;
i=(m+n-1)%n;cnt=0;
while(a[i]) i=(n+i-1)%n,cnt++;
if(cnt&1) return 1;
for(int i=-1;i<=1;i+=2){
if(i==1) k=m;
else k=(m+n-1)%n;
for(int j=1;j<=a[k];j++){
a[k]-=j;
if(!dfs((n+i+m)%n)){
a[k]+=j;
return 1;
}
a[k]+=j;
}
}
return 0;
}
int main()
{
int t;
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
puts(dfs(0)?"YES":"NO");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: