[菜鸟做法]
分三次枚举 看了其他大佬的做法原来是要直接枚举
/////
C++ 代码
include[HTML_REMOVED]
using namespace std;
int mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
struct d{
int y;
int m;
int d;
}ans[50];
int run(int y,int m){
if((y%4==0&&y%100)||y%400==0){
if(m==2)return 29;
return mon[m];
}
else return mon[m];
}
bool check(int y,int m,int d){
if(y<1960||y>2059)return false;
if(m>12||m<0)return false;
if(d<=0||d>run(y,m))return false;
return true;
}
bool sort1(d a,d b){
if(a.y>b.y)return false;
if(a.y==b.y&&a.m>b.m)return false;
if(a.y==b.y&&a.m==b.m&&a.d>b.d)return false;
return true;
}
int main(){
int a,b,c,flag1=0,flag2=0,flag3=0;
char s;
scanf(“%d%c%d%c%d”,&a,&s,&b,&s,&c);
if(a==b)flag1=1;//年月相同
if(b==c)flag2=1;//月日相同
if(a==c)flag3=1;//年日相同
int k=0;
for(int i=19;i<=20;i){//月日年
int year=i*100+c;
int month=a;
int day=b;
if(check(year,month,day)){
ans[k].y=year,ans[k].m=month,ans[k].d=day;
k;
}
}
for(int i=19;i<=20;i){//日月年
int year=i*100+c;
int month=b;
int day=a;
if(check(year,month,day)){
ans[k].y=year,ans[k].m=month,ans[k].d=day;
k;
}
}
for(int i=19;i<=20;i){//年月日
int year=i*100+a;
int month=b;
int day=c;
if(check(year,month,day)){
ans[k].y=year,ans[k].m=month,ans[k].d=day;
k;
}
}
sort(ans,ans+k,sort1);
printf(“%04d-%02d-%02d\n”,ans[0].y,ans[0].m,ans[0].d);
for(int i=1;i<k;i++){
if(ans[i].y!=ans[i-1].y||ans[i].m!=ans[i-1].m||ans[i].d!=ans[i-1].d)
printf(“%04d-%02d-%02d\n”,ans[i].y,ans[i].m,ans[i].d);
}
return 0;
}