您的位置:首页 > 其它

bzoj1188 分裂游戏 博弈论

2015-12-04 20:02 169 查看
这道题目子游戏居然是一个石子,涨姿势了。果然写第一道sg就被完杀Q_Q。

定义子游戏sg(x)表示x中的一个石子的sg值。由于一堆狮子中每一个石子都是独立的,所以这一堆(设有a[i])作为一个子游戏的值即a[i]&1 * sg(i)。由于这一个石子变成了另外两个石子,所以这个子游戏的后续状态值就是另外两个子游戏的亦或。表达实在不好,。。。自己体会吧。

下附AC代码:

<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n,cnt,ans,a[25],f[25]; bool bo[10005];
int sg(int x){
if (x==n) return 0;
if (f[x]!=-1) return f[x];
int j,k; memset(bo,0,sizeof(bo));
for (j=x+1; j<=n; j++)
for (k=j; k<=n; k++)
bo[sg(j)^sg(k)]=1;
for (j=0; bo[j]; j++); return f[x]=j;
}
int main(){
int cas; scanf("%d",&cas);
while (cas--){
scanf("%d",&n); cnt=ans=0; int i,j,k;
memset(f,-1,sizeof(f));
for (i=1; i<=n; i++){
scanf("%d",&a[i]);
if (a[i]&1) ans^=sg(i);
}
for (i=1; i<n; i++)
for (j=i+1; j<=n; j++)
for (k=j; k<=n; k++)
if (!(ans^sg(i)^sg(j)^sg(k)))
if ((++cnt)==1) printf("%d %d %d\n",i-1,j-1,k-1);
if (!cnt) puts("-1 -1 -1"); printf("%d\n",cnt);
}
return 0;
}</span>


by lych

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