牛年

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

题目描述

Farmer John 的奶牛们得知最近正在庆祝牛年的到来时十分兴奋。

牛年总是奶牛们的最爱。

我们知道,中国历法中每一年所对应的生肖遵循 12 年的周期:Ox, Tiger, Rabbit, Dragon, Snake, Horse, Goat, Monkey, Rooster, Dog, Pig, Rat(牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪、鼠),然后回到牛。

奶牛 Bessie 自豪地说她是在许多年前的一个牛年出生的。

她的朋友 Elsie 想要知道她与 Bessie 出生相差多少年,并且希望你能够通过查看农场上若干奶牛出生年份之间的关系来帮助她推算。

输入格式

输入的第一行包含一个整数 N。

以下 N 行每行包含一个 8 个单词的短语,指定了两头奶牛的出生年份之间的关系,格式为 Mildred born in previous Dragon year from Bessie(Mildred 在 Bessie 出生的前一个龙年出生),或 Mildred born in next Dragon year from Bessie(Mildred 在 Bessie 出生的后一个龙年出生)。

最后一个单词是农场上某一头奶牛的名字,为 “Bessie” 或一头已经在之前的输入中出现过的奶牛。

第一个单词是农场上某一头奶牛的名字,不为 “Bessie” 且未在之前的输入中出现过。

所有的奶牛名字不超过 10 个字符,且仅包含字符 a..za..z 或 A..ZA..Z。

第 5 个单词是上述十二生肖之一。

第 4 个单词是 previous(之前)或 next(之后)之一。

例如,如果短语为 Mildred born in previous Dragon year from Bessie,则 Mildred 的出生年份为最为接近且严格处于 Bessie 的出生年份之前(不等于)的龙年。

输出格式

输出 Bessie 和 Elsie 的出生年份之间相差的年数。输入保证可以通过给定的信息求出结果。

数据范围

1≤N≤100

输入样例:

4
Mildred born in previous Dragon year from Bessie
Gretta born in previous Monkey year from Mildred
Elsie born in next Ox year from Gretta
Paulina born in next Dog year from Bessie
复制代码

输出样例:

12
复制代码

样例解释

在以上的输入中,

  • Elsie 在 Bessie 之前 12 年出生。
  • Mildred 在 Bessie 之前 9 年出生。
  • Gretta 在 Bessie 之前 17 年出生。
  • Paulina 在 Bessie 之后 9 年出生。

思路

仔细阅读题目的意思后发现题意,其实就是给定n个两头牛之间的出生关系,a在b的前或后12年中的xx年出生,这里的xx用a,b的生肖和出生前后顺序计算。我们可以使用c++中的容器unordered_map来存储各个生肖所代表的具体数字,然后存储每个牛对应的年龄和生肖。这样给定第一头牛的相关信息后,就可以很方便的计算出下一只牛的相应年龄。

计算步骤:

  • 如果两只牛的生肖相同,并且出现了关键词(“previous”),那么当前牛的年龄就等于前一只牛的年龄-12;
  • 如果生肖不相同,并且出现了关键词(“previous”),用后出生者的生肖序号减去先出生者的生肖序号,模12取正值即为a,b的年龄差值,再用b的年龄加减这个年龄差值即为当前牛的年龄。

代码

#include <iostream>
#include <unordered_map>
#include <string.h>
using namespace std;
​
unordered_map<string, int> ans ={
    {"Ox",0}, {"Tiger",1}, {"Rabbit",2}, {"Dragon",3},
    {"Snake",4}, {"Horse",5}, {"Goat",6}, {"Monkey",7},
    {"Rooster",8}, {"Dog",9}, {"Pig",10}, {"Rat",11}
};
​
int main()
{
    int n;
    cin >> n;
    unordered_map<string, int> age;
    unordered_map<string, string> nx;
    age["Bessie"] = 0;
    nx["Bessie"] = "Ox";
    while(n --)
    {
        string s1[8];
        for(int i = 0;i < 8;i ++) cin >> s1[i];
        nx[s1[0]] = s1[4];
        // 计算年龄
        // 如果生肖相同
        if(s1[4] == nx[s1[7]]) age[s1[0]] = (s1[3] == "previous" ? age[s1[7]] - 12 : age[s1[7]] + 12);
        else{
        age[s1[0]] = (s1[3] == "previous" ? age[s1[7]] - (ans[nx[s1[7]]] - ans[s1[4]] + 12) % 12 : age[s1[7]] + (ans[s1[4]] - ans[nx[s1[7]]]+ 12) % 12);
​
        }
        
    }
    
    cout << abs(age["Elsie"]) << endl;
    return 0;
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享