AcWing 1229. 日期问题(模拟,日期问题)

写了一个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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值