题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。
小明知道这些日期都在1960年1月1日至2059年12月31日。
令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入格式
一个日期,格式是”AA/BB/CC”。
即每个’/’隔开的部分由两个 0-9 之间的数字(不一定相同)组成。
输出格式
输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。
多个日期按从早到晚排列。
数据范围
0≤A,B,C≤9
样例
输入样例:
02/03/04
输出样例:
2002-03-04
2004-02-03
2004-03-02
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int Date1 = 19600101;
const int Date2 = 20591231;
struct node{
int year, mon, day;
node(int year, int mon, int day): year(year), mon(mon), day(day){}
};
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
static bool cmp(node *a, node *b){
if(a->year != b->year) return a->year < b->year;
if(a->mon != b->mon) return a->mon < b->mon;
return a->day < b->day;
}
bool isDate(int year, int mon, int day){
days[2] = 28;
if(year%4 == 0 && year%100 != 0 || year%400 == 0) days[2] = 29;
return mon > 0 && mon < 13 && day > 0 && day <= days[mon];
}
int main(){
int in[3], date;
vector<node*> ans;
map<int, bool> sign;
scanf("%d/%d/%d", &in[0], &in[1], &in[2]);
date = ((1900+in[0])*100+in[1])*100+in[2];
if(isDate(1900+in[0], in[1], in[2]) && date >= Date1 && date <= Date2){
ans.push_back(new node(1900+in[0], in[1], in[2]));
sign[date] = true;
}
date = ((1900+in[2])*100+in[0])*100+in[1];
if(!sign[date] && isDate(1900+in[2], in[0], in[1]) && date >= Date1 && date <= Date2){
ans.push_back(new node(1900+in[2], in[0], in[1]));
sign[date] = true;
}
date = ((1900+in[2])*100+in[1])*100+in[0];
if(!sign[date] && isDate(1900+in[2], in[1], in[0]) && date >= Date1 && date <= Date2){
ans.push_back(new node(1900+in[2], in[1], in[0]));
sign[date] = true;
}
date = ((2000+in[0])*100+in[1])*100+in[2];
if(!sign[date] && isDate(2000+in[0], in[1], in[2]) && date >= Date1 && date <= Date2){
ans.push_back(new node(2000+in[0], in[1], in[2]));
sign[date] = true;
}
date = ((2000+in[2])*100+in[0])*100+in[1];
if(!sign[date] && isDate(2000+in[2], in[0], in[1]) && date >= Date1 && date <= Date2){
ans.push_back(new node(2000+in[2], in[0], in[1]));
sign[date] = true;
}
date = ((2000+in[2])*100+in[1])*100+in[0];
if(!sign[date] && isDate(2000+in[2], in[1], in[0]) && date >= Date1 && date <= Date2){
ans.push_back(new node(2000+in[2], in[1], in[0]));
sign[date] = true;
}
sort(ans.begin(), ans.end(), cmp);
for(int i = 0; i < ans.size(); i++)
printf("%d-%02d-%02d\n", ans[i]->year, ans[i]->mon, ans[i]->day);
return 0;
}