• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
镂空的行尸
   首页       联系   管理    订阅  订阅

A Simple Nim (SG打表找规律)

  题意:有n堆石子,每次可以将其中一堆分为数量不为0的3堆,或者从其中一堆中拿走若干个,最终拿完的那个人赢。

  思路:直接暴力SG状态,然后找出其中的规律,异或一下每一堆的状态就可以了。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int maxn = 1e3 + 7;bool flag[maxn];
int sg[maxn];

int getSg(int x){
    if(sg[x] != -1) return sg[x];
    memset(flag, 0, sizeof(flag));
    for(int i = 1; i < x; i ++){
        int sgi = getSg(i);
        for(int j = 1; j < x - i; j ++){
            int sgj = getSg(j);
            int sgk = getSg(x - i - j);
            flag[sgi^sgj^sgk] = true;
        }
        flag[i] = true;
    }
    for(int i = 1; ;i ++) if(!flag[i]) return i;
}

int main(){
    int T = 100, n;
    memset(sg, - 1, sizeof(sg));
    for(int i = 0; i <= T; i ++){
        printf("%d %d\n", i, sg[i] = getSg(i));
    }
    return 0;
}

 

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int maxn = 1e3 + 7;int getSg(int x){
    if(x <= 2) return x;
    else if(x % 8 == 7) return x + 1;
    else if(x % 8 == 0) return x - 1;
    else return x;
}

int main(){
    int T, n, m;scanf("%d", &T);
    for(int ncase = 1; ncase <= T; ncase ++){
        scanf("%d", &n);
        int sta = 0;
        for(int i = 0; i < n; i ++){
            scanf("%d", &m);
            sta ^= getSg(m);
        }
        printf("%s\n", sta?"First player wins.":"Second player wins.");
    }
    return 0;
}

 

more crazy more get!
posted @ 2018-11-07 10:31  镂空的行尸  阅读(206)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3