小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非 常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期 与其对应。
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。
在这里给出一组输入。例如:
02/03/04在这里给出相应的输出。例如:
2002-03-04 2004-02-03 2004-03-02 #include<iostream> #include<cstdio> #include<string> #include<algorithm> #include<cstring> #include<vector> #include<map> #include<set> using namespace std; const int inf=0x3fffffff; const int maxn=10010; int cnt=0; struct node{ int y,m,d; node(){} node(int a,int b,int c){ y=a, m=b, d=c; } }nodes[3]; bool cmp(node a,node b){ if(a.y!=b.y) return a.y<b.y; if(a.m!=b.m) return a.m<b.m; return a.d<b.d; } bool isLeap(int y){ return (y%400==0) || (y%4==0 && y%100!=0) ; } void print(int a,int b,int c){ // y , m , d int y=0,m=0,d=0; if(a>=0 && a<=59){ y = 2000+a; }else if(a>=60 && a<=99){ y = 1900+a; } if(b>=1 && b<=12) m = b; if(c>=1 && c<=31) d = c; if(y&&m&&d){ if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){ if(d>=1 && d<=31) nodes[cnt++] = node(y,m,d); } else if(m==4||m==6||m==9||m==11){ if(d>=1 && d<=30) nodes[cnt++] = node(y,m,d); } else if(isLeap(y) && m==2 &&d<=29) nodes[cnt++] = node(y,m,d); else if(!isLeap(y) && d<=28) nodes[cnt++] = node(y,m,d); } } int main(){ int a,b,c; scanf("%d/%d/%d",&a,&b,&c); // // 日 1 - 31 // 月 1 - 12 // 年 0 - 59 20 60 - 99 19 // abc 年月日 print(a,b,c); //abc 月日年 print(c,a,b); //abc 日月年 print(c,b,a); sort(nodes,nodes+cnt,cmp); for(int i=0;i<cnt;i++){ int f=1; for(int j=0;j<i;j++){ if(nodes[i].y == nodes[j].y && nodes[i].m == nodes[j].m && nodes[i].d == nodes[j].d) f=0; } if(f) printf("%04d-%02d-%02d\n",nodes[i].y,nodes[i].m,nodes[i].d); } return 0; }