生活大爆炸版石头剪刀布

思路

  • 数字化选择方式
  • 纯手抄一个map<pair<int, int>, int> mp用来记录出拳结果。如mp[{2,0}] = 2;表示b赢了
  • 直接取余数组处理得到结果

题解

#include <bits/stdc++.h>
using namespace std;
int main()
{
    // 0 表示 剪刀,
    // 1 表示 石头,
    // 2 表示 布,
    // 3 表示 蜥蜴人,
    // 4 表示 斯波克
    // 结果0表示平局,1表示a赢,2表示b赢
    map<pair<int, int>, int> mp;
    int n,na,nb;
    int result[3]={0}; //0无意义,1为a分数,2为b分数
    cin >> n >> na >> nb;
    vector<int> a(na),b(nb);
    for (int i=0;i<na;i++)
    {
        cin >> a[i];
    }
    for (int i=0;i<nb;i++)
    {
        cin >> b[i];
    }
    for(int i=0;i<5;i++)
    {
        mp[{i,i}] = 0;
    }
    mp[{2,0}] = 2;
    mp[{3,0}] = 2;
    mp[{3,1}] = 2;
    mp[{4,2}] = 2;
    mp[{4,3}] = 2;
    mp[{1,0}] = 1;
    mp[{2,1}] = 1;
    mp[{3,2}] = 1;
    mp[{4,0}] = 1;
    mp[{4,1}] = 1;
    mp[{0,2}] = 1;
    mp[{0,3}] = 1;
    mp[{1,3}] = 1;
    mp[{2,4}] = 1;
    mp[{3,4}] = 1;
    mp[{0,1}] = 2;
    mp[{1,2}] = 2;
    mp[{2,3}] = 2;
    mp[{0,4}] = 2;
    mp[{1,4}] = 2;
    for(int i=0;i<n;i++)
    {
        int xi = i%na;
        int x = a[i%na];
        int y = b[i%nb];
        result[mp[{x,y}]]++;
    }
    cout << result[1] << " " << result[2] << endl;
    return 0;
}

优化

看了别人的题解,大多是用一个二维[5][5]的数组存储对局输赢,后面处理简单一些。