蓝桥杯第八届省赛-日期问题

蓝桥杯第八届省赛-日期问题

日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

看到这个题目时开始感觉很多头绪,而且需要很多单独的小函数确定一些东西,如果全程传递这样三个变量还是很麻烦的,所以用一个结构体和一个结构体数组还是很方便的,因为给出的任意一个输入会有6种组合方式,一旦这个难点解决掉了,这个题就很简单了。
代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct Date{
    
    
	int year;
	int month;
	int day;
};
void Print(Date&d){
    
    
	 printf("%02d-%02d-%02d\n", d.year, d.month, d.day);
}
bool IsYear(int year){
    
    
	if((year%4==0 && year%100!=0) || year%400==0)
		return true;
	return false;
}
bool Compare(const Date&d1,const Date&d2){
    
    
	if(d1.year!=d2.year)
		return d1.year<d2.year;
	if(d1.month!=d2.month)
		return d1.month<d2.month;
	return d1.day<d2.day;
}
bool CheckDate(Date&d){
    
    
	int months[13]={
    
    0,31,28,31,30,31,30,31,31,30,31,30,31};
	if(IsYear(d.year))
		months[2]=29;
	else
		months[2]=28;
	if(d.year<1960 || d.year>2059)
		return false;
	if(d.day<1 || d.day>months[d.month])
		return false;
	return true;
}
bool checkEquals(Date date[],int i){
    
    
	for(int j=i+1;j<6;j++){
    
    
		if(date[i].year==date[j].year)
			if(date[i].month==date[j].month && date[i].day==date[j].day)
				return false;
	}
	return true;
}
int main(){
    
    
	int a,b,c;
	scanf("%d/%d/%d", &a, &b, &c);
	Date date[6]={
    
    
	{
    
    2000+a,b,c},
	{
    
    2000+c,a,b},
	{
    
    2000+c,b,a},
	{
    
    1900+a,b,c},
	{
    
    1900+c,a,b},
	{
    
    1900+c,b,a},
	};
	sort(date,date+6,Compare);
	for(int i=0;i<6;i++){
    
    
		if(CheckDate(date[i]))
			if(checkEquals(date,i))	
				Print(date[i]);	
	}
	return 0;	
} 

猜你喜欢

转载自blog.csdn.net/weixin_46610759/article/details/108312378