您的位置:首页 > 其它

UVALive 3668 A Funny Stone Game(博弈)

2014-01-25 19:39 573 查看
Description

The funny stone game is coming. There are n piles of stones, numbered with 0, 1, 2,..., n - 1. Two persons pick stones in turn. In every turn, each person selects three piles of stones numbered i, j, k (i < j, j

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;

const int MAXN = 23;

int sg[MAXN + 5];
bool mex[MAXN * MAXN];
int n, s[MAXN];

void build_sg() {
for(int i = MAXN - 1; i >= 0; --i) {
memset(mex, 0, sizeof(mex));
for(int j = i + 1; j < MAXN; ++j) {
for(int k = j; k < MAXN; ++k) mex[sg[j] ^ sg[k]] = true;
}
for(int j = 0; ; ++j)
if(!mex[j]) {sg[i] = j; break;}
}
}

void solve() {
int ans = 0, *sg = ::sg + MAXN - n;
for(int i = 0; i < n; ++i) ans ^= sg[i] * (s[i] & 1);
if(ans == 0) {
printf(" -1 -1 -1\n");
return ;
}
for(int i = 0; i < n; ++i) {
if(s[i] == 0) continue;
for(int j = i + 1; j < n; ++j) {
for(int k = j; k < n; ++k) {
if((sg[i] ^ sg[j] ^ sg[k] ^ ans) == 0) {
printf(" %d %d %d\n", i, j, k);
return ;
}
}
}
}
}

int main() {
build_sg();
int cnt = 0;
while(scanf("%d", &n) != EOF && n) {
for(int i = 0; i < n; ++i) scanf("%d", &s[i]);
printf("Game %d:", ++cnt);
solve();
}
}


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