题目描述
给定一个日期,格式是“AA/BB/CC”,可能为年/月/日,月/日/年,日/月/年。
求在1960年1月1日至2059年12月31日之间可能的排列情况。
输入样例
02/03/04
输出样例
2002-03-04
2004-02-03
2004-03-02
解题代码
#include <iostream>
using namespace std;
int ms[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; // 各个月的天数
bool right(int y,int m,int d) // 判断日期是否成立
{
ms[2] = y % 4 == 0 && y % 100 != 0 || y % 400 == 0 ? 29:28; // 闰年2月天数为29,平年为28
if(m == 0 || m > 12 || d > ms[m] || d == 0) return false; // 月份~[0,12],天数~[1,ms[m]]
return true;
}
void print(int y,int m,int d) // 输出格式
{
if(y < 10) cout << "200" << y << '-'; // 200y-
else if(y < 60) cout << "20" << y << '-'; // 20y-
else cout << "19" << y << '-'; // 19y-
if(m < 10) cout << "0" << m << '-'; // 0m-
else cout << m << '-'; // m-
if(d < 10) cout << "0" << d << '\n'; // 0d
else cout << d << '\n'; // d
}
int main()
{
int a, b, c;
scanf("%d/%d/%d", &a, &b, &c);
//先以a为年,ac不相等
if(a < c)
{
if(right(a,b,c)) print(a,b,c);
//再以c为年
if(a < b) //先以a为月,abc不相等
{
if(right(c,a,b)) print(c,a,b);
if(right(c,b,a)) print(c,b,a);
}
else //先以b为月,ac不相等 ,ab可能相等
{
if(right(c,b,a)) print(c,b,a);
if(a != b) if(right(c,a,b)) print(c,a,b); // 判断防止cba和cab重复
}
}
//先以c为年,ac可能相等
else
{
//先以a为月,ab不相等
if(a < b)
{
if(right(c,a,b)) print(c,a,b);
if(right(c,b,a)) print(c,b,a);
}
//先以b为月,ab可能相等
else
{
if(right(c,b,a)) print(c,b,a);
if(a != b) if(right(c,a,b)) print(c,a,b);// 判断防止cba和cab重复
}
//再以a为年
if(a != c && right(a,b,c)) print(a,b,c);// 判断防止abc和cba重复
}
return 0;
}