写了一个170多行的模拟,以此纪念。
并且同时提醒自己,在做日期相关题目时,一定要考虑好闰年和平年,然后再考虑相应的月份和每个月的日期是否都是合法的。
并且领悟了一个:如果要判断三个元素组成的结构体是否访问过,如果用结构体当map的key会很麻烦,但是如果开两个map,一个map存1,2个元素,另一个存2,3个元素,也可以实现判断三个元素的功能。
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#pragma warning (disable:4996)
using namespace std;
#define pii pair<int,int>
const int month1[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
const int month2[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
struct Date {
int year;
int month;
int day;
};
bool com(Date a, Date b) {
if (a.year > b.year)return 0;
else if (a.year < b.year) {
return 1;
}
else {
if (a.month > b.month)return 0;
else if (a.month < b.month)return 1;
else {
if (a.day > b.day)return 0;
else if (a.day <= b.day)return 1;
}
}
}
bool isRun(int year) {
return (year % 100 != 0 && year % 4 == 0) || (year % 400 == 0);
}
int main() {
int n1, n2, n3;
int cnt = 0;
vector<Date>date;
map< pii, bool >vis;
map< pii, bool>vis2;
scanf("%d/%d/%d", &n1, &n2, &n3);
//可能的情况:年/月/日 月/日/年 日/月/年
//满足条件:年:19:60,61,62....99
//20:01,02,....59
//3.输出日/月/年情况
//n1:day,n2:month,n3:year
if (n3 >= 60) {
int year = 1900 + n3;
if (isRun(year)) {
if (n2 >= 1 && n2 <= 12) {
if (n1 >= 1 && n1 <= month2[n2]) {
date.push_back({ year,n2,n1 });
}
}
}
else {
if (n2 >= 1 && n2 <= 12) {
if (n1 >= 1 && n1 <= month1[n2]) {
date.push_back({ year,n2,n1 });
}
}
}
}
else {
int year = 2000 + n3;
if (isRun(year)) {
if (n2 >= 1 && n2 <= 12) {
if (n1 >= 1 && n1 <= month2[n2]) {
date.push_back({ year,n2,n1 });
}
}
}
else {
if (n2 >= 1 && n2 <= 12) {
if (n1 >= 1 && n1 <= month1[n2]) {
date.push_back({ year,n2,n1 });
}
}
}
}
//2.输出月/日/年情况
//n1:month,n2:day,n3:year
if (n3 >= 60) {
int year = 1900 + n3;
if (isRun(year)) {
if (n1 >= 1 && n1 <= 12) {
if (n2 >= 1 && n2 <= month2[n1]) {
date.push_back({ year,n1,n2 });
}
}
}
else {
if (n1 >= 1 && n1 <= 12) {
if (n2 >= 1 && n2 <= month1[n1]) {
date.push_back({ year,n1,n2 });
}
}
}
}
else {
int year = 2000 + n3;
if (isRun(year)) {
if (n1 >= 1 && n1 <= 12) {
if (n2 >= 1 && n2 <= month2[n1]) {
date.push_back({ year,n1,n2 });
}
}
}
else {
if (n1 >= 1 && n1 <= 12) {
if (n2 >= 1 && n2 <= month1[n1]) {
date.push_back({ year,n1,n2 });
}
}
}
}
//1.输出年/月/日情况
//n1:年。n2:月。n3:日
//判断闰年==>>判断月和日是否正确
if (n1 >= 60) {
int year = 1900 + n1;
if (isRun(year)) {
if (n2 >= 1 && n2 <= 12) {
if (n3 >= 1 && n3 <= month2[n2]) {
date.push_back({ year,n2,n3 });
}
}
}
else {
if (n2 >= 1 && n2 <= 12) {
if (n3 >= 1 && n3 <= month1[n2]) {
date.push_back({ year,n2,n3 });
}
}
}
}
else {
int year = 2000 + n1;
if (isRun(year)) {
if (n2 >= 1 && n2 <= 12) {
if (n3 >= 1 && n3 <= month2[n2]) {
date.push_back({ year,n2,n3 });
}
}
}
else {
if (n2 >= 1 && n2 <= 12) {
if (n3 >= 1 && n3 <= month1[n2]) {
date.push_back({ year,n2,n3 });
}
}
}
}
sort(date.begin(), date.end(), com);
for (int i = 0; i < date.size(); i++) {
if (!vis[{date[i].year, date[i].month}])
if (!vis[{date[i].year, date[i].month}])
printf("%d-%02d-%02d\n", date[i].year, date[i].month, date[i].day),vis[{date[i].year, date[i].month}] = 1, vis[{date[i].year, date[i].month}] = 1;
}
return 0;
}