果壳游戏

117 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

为了消磨时光,奶牛 Bessie 和她的朋友 Elsie 喜欢玩一种她们在农业展览会上看到的游戏。

游戏准备阶段,Bessie 在桌子上放置三个倒置的坚果壳,1号坚果壳放在位置1,2号坚果壳放在位置2,3号坚果壳放在位置3。并在其中一个坚果壳下面藏了一块小的鹅卵石(至少她希望这是一块鹅卵石——她在一块牧场的地上找到的)。

随后 Bessie 会两两调换坚果壳,鹅卵石会随着坚果壳一起移动,同时 Elsie 试着去猜鹅卵石的位置。

奶牛们在农业展览会上看到的这个游戏的标准形式是玩家可以看到鹅卵石初始的位置,然后要求玩家猜所有交换完成之后鹅卵石最终的位置。

然而,现在奶牛们想要去进行这样一种玩法,Elsie 不知道鹅卵石的初始位置,同时她可以在每一次交换之后猜一下鹅卵石的位置。

Bessie 知道正确答案,在游戏结束后会给 Elsie 一个分数,等于她猜对的次数。

给定所有的交换和 Elsie 的猜测,但是不给出鹅卵石的初始位置,请求出 Elsie 最高可能获得的分数。

输入格式

输入的第一行包含一个整数 NN,为交换的次数。

以下 NN 行每行描述了游戏的一个回合,包含三个整数 a、b和 g,表示 Bessie 交换了位置 a 和 b 的坚果壳,然后 Elsie 猜的是位置 gg。

所有这三个数均为 1、2、3之一,并且 a≠b。

输出格式

输出 Elsie 可以得到的最高分数。

数据范围

1≤N≤100

输入样例:

3
1 2 1
3 2 1
1 3 1

输出样例:

2

样例解释

在这个例子中,Elsie 最多可以获得 22 分。

如果鹅卵石开始时位于坚果壳 11 下面,那么她猜中了一次(最后一次)。

如果鹅卵石开始时位于坚果壳 22 下面,那么她猜中了两次(开始两次)。

如果鹅卵石开始时位于坚果壳 33 下面,那么她没有猜对任何一次。

思路

用数组存储每一次对局的交换情况,和玩家猜测的情况。再用循环假设果壳第一次会出现在第几个易拉罐中(第一次出现的位置会决定最后猜中的次数),然后在每一次循环中带入对局情况,更新结果,最后得出最大值。

代码

#include <iostream>
#include <cstring>
​
using namespace std;
​
const int N = 110;
int q[N];
int x[N],y[N],z[N];
​
int main()
{
    int n;
    cin >> n;
    int m = n;
    // 定义答案
    int res = 0;
    memset(q, 0, sizeof q);
    // 存储交换的情况,和猜的情况
    for(int i = 1;i <= n;i ++) scanf("%d%d%d",&x[i],&y[i],&z[i]);
​
    for(int i = 1;i <= 3;i ++)
    {
        // 模拟每一种情况
        q[i] = 1;
        int ans = 0;
        // 开始玩游戏
        for(int i = 1;i <= n;i ++)
        {
            int t = q[x[i]];
            q[x[i]] = q[y[i]];
            q[y[i]] = t;
            if(q[z[i]] == 1) ans ++;
        }
        memset(q, 0, sizeof q);
        n = m;
        res = max(res, ans);
​
    }
    cout << res << endl;
​
​
}