设为首页 加入收藏

TOP

uva 1378 - A Funny Stone Game(组合游戏)
2015-07-20 17:57:52 来源: 作者: 【 】 浏览:1
Tags:uva 1378 Funny Stone Game 组合 游戏

题目链接:uva 1378 - A Funny Stone Game

题目大意;两个人玩游戏,对于一个序列,轮流操作,每次选中序列中的i,j,k三个位置要求i

解题思路:首先预处理出各个位置上的SG值,然后对于给定序列,枚举位置转移状态后判断是否为必败态即可。

#include 
   
     #include 
    
      #include 
     
       using namespace std; const int maxn = 30; int n, g[maxn], s[maxn]; int SG (int l) { int vis[1000]; memset(vis, 0, sizeof(vis)); for (int i = 0; i < l; i++) { for (int j = 0; j < l; j++) vis[g[i]^g[j]] = 1; } int ret = -1; while (vis[++ret]); return ret; } void init () { g[0] = 0; for (int i = 1; i < maxn; i++) g[i] = SG(i); } int judge () { int ret = 0; for (int i = 0; i < n-1; i++) { if (s[i]&1) ret ^= g[n-1-i]; } return ret; } void put_ans () { for (int i = 0; i < n-1; i++) { if (s[i] == 0) continue; s[i]--; for (int j = i+1; j < n; j++) { s[j]++; for (int k = j; k < n; k++) { s[k]++; if (judge() == 0) { printf(" %d %d %d\n", i, j, k); return; } s[k]--; } s[j]--; } s[i]++; } } int main () { init(); int cas = 1; while (scanf("%d", &n) == 1 && n) { for (int i = 0; i < n; i++) scanf("%d", &s[i]); printf("Game %d:", cas++); if (judge()) put_ans(); else printf(" -1 -1 -1\n"); } return 0; }
     
    
   
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ 文件include规则 常量定义 下一篇C++调用成员函数需要this指针的情..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: