POJ 1008. Maya Calendar
试题链接:POJ 1008
本题关键是要推出Haab历法和Tzolkin历法之间的转换关系。
设在Haab历法下,该天在该月的编号为
D
H
D_H
DH,月份为
M
H
M_H
MH,年份为
Y
H
Y_H
YH,即日期表示为
D
H
.
M
H
Y
H
D_H. M_H Y_H
DH.MHYH
这里
Y
H
=
0
,
1
,
2
,
⋯
Y_H = 0, 1, 2, \cdots
YH=0,1,2,⋯,
M
H
=
0
,
1
,
⋯
,
18
M_H = 0, 1, \cdots, 18
MH=0,1,⋯,18,当
M
H
=
0
,
1
,
⋯
,
17
M_H = 0, 1, \cdots, 17
MH=0,1,⋯,17时,
D
H
=
0
,
1
,
⋯
,
19
D_H = 0, 1, \cdots, 19
DH=0,1,⋯,19;而当
M
H
=
19
M_H = 19
MH=19时,
D
H
=
0
,
1
,
2
,
3
,
4
D_H = 0, 1, 2, 3, 4
DH=0,1,2,3,4。
设在Tzolkin历法下,编号为
N
T
N_T
NT,该天的名称为
D
T
D_T
DT,年份为
Y
T
Y_T
YT,则日期表示为
N
T
D
T
Y
T
N_T D_T Y_T
NTDTYT
这里,
N
T
=
1
,
2
,
⋯
,
13
N_T = 1, 2, \cdots, 13
NT=1,2,⋯,13,
D
T
=
0
,
1
,
⋯
,
19
D_T = 0, 1, \cdots, 19
DT=0,1,⋯,19,
Y
T
=
0
,
1
,
⋯
Y_T = 0, 1, \cdots
YT=0,1,⋯。
接着设从第一天(the first day)到给定日期之间的总天数为
S
S
S,则有
S
=
365
Y
H
+
20
M
H
+
D
H
S = 365 Y_H + 20 M_H + D_H
S=365YH+20MH+DH
于是,可得
N
T
=
S
%
13
+
1
D
T
=
S
%
20
Y
T
=
S
/
/
(
13
×
20
)
\begin{aligned} N_T &= S \% 13 + 1 \\ D_T &= S \% 20 \\ Y_T &= S // (13\times20) \end{aligned}
NTDTYT=S%13+1=S%20=S//(13×20)
剩下的只要再做一些数字同名称的映射即可。
代码如下:
#include <stdio.h>
#include <iostream>
#include <map>
#include <string>
using namespace std;
const map<string, int>::value_type init_Haab_month[] = {
map<string, int>::value_type("pop", 0),
map<string, int>::value_type("no", 1),
map<string, int>::value_type("zip", 2),
map<string, int>::value_type("zotz", 3),
map<string, int>::value_type("tzec", 4),
map<string, int>::value_type("xul", 5),
map<string, int>::value_type("yoxkin", 6),
map<string, int>::value_type("mol", 7),
map<string, int>::value_type("chen", 8),
map<string, int>::value_type("yax", 9),
map<string, int>::value_type("zac", 10),
map<string, int>::value_type("ceh", 11),
map<string, int>::value_type("mac", 12),
map<string, int>::value_type("kankin", 13),
map<string, int>::value_type("muan", 14),
map<string, int>::value_type("pax", 15),
map<string, int>::value_type("koyab", 16),
map<string, int>::value_type("cumhu", 17),
map<string, int>::value_type("uayet", 18)
};
static map<string, int> Haab_month_map(init_Haab_month, init_Haab_month+19);
const map<int, string>::value_type init_Tzolkin_day[] = {
map<int, string>::value_type(0, "imix"),
map<int, string>::value_type(1, "ik"),
map<int, string>::value_type(2, "akbal"),
map<int, string>::value_type(3, "kan"),
map<int, string>::value_type(4, "chicchan"),
map<int, string>::value_type(5, "cimi"),
map<int, string>::value_type(6, "manik"),
map<int, string>::value_type(7, "lamat"),
map<int, string>::value_type(8, "muluk"),
map<int, string>::value_type(9, "ok"),
map<int, string>::value_type(10, "chuen"),
map<int, string>::value_type(11, "eb"),
map<int, string>::value_type(12, "ben"),
map<int, string>::value_type(13, "ix"),
map<int, string>::value_type(14, "mem"),
map<int, string>::value_type(15, "cib"),
map<int, string>::value_type(16, "caban"),
map<int, string>::value_type(17, "eznab"),
map<int, string>::value_type(18, "canac"),
map<int, string>::value_type(19, "ahau")
};
static map<int, string> Tzolkin_day_map(init_Tzolkin_day, init_Tzolkin_day+20);
int main()
{
int n;
int Haab_number_of_the_day;
string Haab_month_name;
int Haab_month;
int Haab_year;
int Tzolkin_number;
int Tzolkin_day;
string Tzolkin_name_of_the_day;
int Tzolkin_year;
int total_day; // number of days from the first day
scanf("%d", &n);
printf("%d\n", n);
while (n--)
{
cin >> Haab_number_of_the_day;
cin.ignore(1); // ignore the dot '.'
cin >> Haab_month_name >> Haab_year;
Haab_month = Haab_month_map[Haab_month_name];
total_day = 365 * Haab_year + Haab_month * 20 + Haab_number_of_the_day;
Tzolkin_number = total_day % 13 + 1;
Tzolkin_day = total_day % 20;
Tzolkin_name_of_the_day = Tzolkin_day_map[Tzolkin_day];
Tzolkin_year = total_day / (13 * 20);
cout << Tzolkin_number << " " << Tzolkin_name_of_the_day << " " << Tzolkin_year << endl;
}
return 0;
}