现在的位置: 首页 > 综合 > 正文

POJ 1008 玛雅历

2018年01月17日 ⁄ 综合 ⁄ 共 2900字 ⁄ 字号 评论关闭
玛雅历
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 67726   Accepted: 20893

Description

上周末,M.A. Ya教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法。这个Haab历法拥有19个月,在开始的18个月,一个月有20天,月份的名字分别是pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu。这些月份中的日期用0到19表示。Haab历的最后一个月叫做uayet,它只有5天,用0到4表示。玛雅人认为这个日期最少的月份是不吉利的,在这个月法庭不开庭,人们不从事交易,甚至没有人打扫屋中的地板。 

因为宗教的原因,玛雅人还使用了另一个历法,在这个历法中年被称为Tzolkin(holly年),一年被分成13个不同的时期,每个时期有20天,每一天用一个数字和一个单词相组合的形式来表示。使用的数字是1~13,使用的单词共有20个,它们分别是:imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau。注意:年中的每一天都有着明确唯一的描述,比如,在一年的开始,日期如下描述:
1 imix, 2 ik, 3 akbal, 4 kan, 5 chicchan, 6 cimi, 7 manik, 8 lamat, 9 muluk, 10 ok, 11 chuen, 12 eb, 13 ben, 1 ix, 2 mem, 3 cib, 4 caban, 5 eznab, 6 canac, 7 ahau, ,8 imix, 9 ik, 10 akbal ……也就是说数字和单词各自独立循环使用。 

Haab历和Tzolkin历中的年都用数字0,1,……表示,数字0表示世界的开始。所以第一天被表示成: 
Haab: 0. pop 0 
Tzolkin: 1 imix 0 
请帮助M.A. Ya教授写一个程序可以把Haab历转化成Tzolkin历。 

Input

Haab历中的数据由如下的方式表示: 
日期. 月份 年数 

输入中的第一行表示要转化的Haab历日期的数据量。下面的每一行表示一个日期,年数小于5000。 

Output

Tzolkin历中的数据由如下的方式表示: 
天数字 天名称 年数 

第一行表示输出的日期数量。下面的每一行表示一个输入数据中对应的Tzolkin历中的日期。

Sample Input

3
10. zac 0
0. pop 0
10. zac 1995

Sample Output

3
3 chuen 0
1 imix 0
9 cimi 2801

Source

Translator

北京大学程序设计实习, Xie Di

解题思路:

这题没什么好说的,就是一个简单的模拟题了,但是要注意这两种计年法之间的联系和差异,也就是说,该怎么认真的理清这两种关系显的尤为的重要.对于第一种纪年法,也就是我们输入的数据,他是说,有18个月,每个月有20天,再有一个月,这个月是5天,记为0 1 2 4.365天算一年.

第二种纪年法是说,天数是由1-13的循环,月份是由1-20个单词的循环,260天算作一年,所以我们只需要认真的理清这个关系就好了,首先由输入的数据计算出days,然后把days传到第二种纪年方法中,由day = days%260%13+1,month = days%260%20+1, year = days/260.

对应在建立起由1-19和1-20的映射就行了.

代码:

# include<cstdio>
# include<iostream>
# include<string>

using namespace std;

int n,days;

void init()
{
    int day;
    int year;
    int month;
    string mon;
    cin>>day;
    getchar();
    getchar();
    cin>>mon;
    cin>>year;

     if (mon == "pop")month = 1;
    if (mon == "no")month = 2;
    if (mon == "zip")month = 3;
    if (mon == "zotz")month = 4;
    if (mon == "tzec")month = 5;
    if (mon == "xul")month = 6;
    if (mon == "yoxkin")month = 7;
    if (mon == "mol")month = 8;
    if (mon == "chen")month = 9;
    if (mon == "yax")month = 10;
    if (mon == "zac")month = 11;
    if (mon == "ceh")month = 12;
    if (mon == "mac")month = 13;
    if (mon == "kankin")month = 14;
    if (mon == "muan")month = 15;
    if (mon == "pax")month = 16;
    if (mon == "koyab")month = 17;
    if (mon == "cumhu")month = 18;
    if (mon == "uayet")month = 19;

    days = day + (month-1)*20+year*365;

}

void work()
{
     int year;
     int month;
     int day;
     year = days/260;
     month = days%260%20+1;
     day = days%260%13+1;
     cout<<day<<" ";
     switch( month )
     {
        case 1: cout << "imix";break;
        case 2: cout << "ik";break;
        case 3: cout << "akbal";break;
        case 4: cout << "kan";break;
        case 5: cout << "chicchan";break;
        case 6: cout << "cimi";break;
        case 7: cout << "manik";break;
        case 8: cout << "lamat";break;
        case 9: cout << "muluk";break;
        case 10: cout << "ok";break;
        case 11: cout << "chuen";break;
        case 12: cout << "eb";break;
        case 13: cout << "ben";break;
        case 14: cout << "ix";break;
        case 15: cout << "mem";break;
        case 16: cout << "cib";break;
        case 17: cout << "caban";break;
        case 18: cout << "eznab";break;
        case 19: cout << "canac";break;
        case 20: cout << "ahau";break;
     }
     cout<<" "<<year<<endl;
}


int main(void)
{
    int n;cin>>n;
    cout<<n<<endl;
    while ( n-- )
    {
        init();
        work();
    }




    return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.