蓝桥杯 日期问题(枚举)


标题:日期问题

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


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

 

思路 : 枚举,一一排除不符合条件的情况即可。

 

  1 #include<iostream>
  2 #include<string>
  3 #include<queue>
  4 #include<set>
  5 #include<cstring>
  6 #include<cmath>
  7 #include<algorithm>
  8 #include<stdio.h>
  9 
 10 
 11 using namespace std;
 12 
 13 struct node
 14 {
 15     int year;
 16     int month;
 17     int day;
 18     
 19     bool operator <(const node& nod)
 20     {
 21         if (year < nod.year)
 22             return true;
 23         if(year > nod.year)
 24             return false;
 25 
 26         if (month < nod.month)
 27             return true;
 28         if(month > nod.month)
 29             return false;
 30 
 31         if (day < nod.day)
 32             return true;
 33         if(day > nod.day)
 34             return false;
 35     }
 36 };
 37 
 38 vector<node> v;
 39 int day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};    //day[i]表示i月总的天数 
 40 int vis[3000][100][100] = {0};
 41 
 42 bool isRunNian(int year)    //判断是否闰年 
 43 {
 44     if(year % 400 == 0)
 45         return true;
 46     
 47     if(year % 4 == 0 && year % 100 != 0)
 48         return true;
 49     
 50     return false;
 51 }
 52 
 53 bool cmp(node a, node b)
 54 {
 55     return a < b;
 56 }
 57 
 58 
 59 int main()
 60 {
 61     int a[4];
 62     scanf("%02d/%02d/%02d", &a[1], &a[2], &a[3]);     
 63     
 64     node p;
 65     
 66     //题中说明,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。 
 67     for(int i = 1; i <= 3; i += 2)    //所以年可能是第1个数或第3个数 
 68     {
 69         for(int j = 1; j <= 2; ++j)    //月可能是第1个数或第2个数 
 70         {
 71             for(int k = 1; k <= 3; ++k)    //日可能是第 1,2,3个数 
 72             {
 73                 if(i == j || i == k || j == k)    
 74                     continue;
 75                     
 76                 p.year = a[i];
 77                 p.month = a[j];
 78                 p.day = a[k];
 79                 
 80                 if(a[j] == 0 || a[k] == 0)    //月份和日期不能为0 
 81                     continue;
 82                 
 83                 if(p.month > 12)        //月份不能大于12 
 84                     continue;
 85                     
 86                 if(a[i] <= 59)
 87                     p.year += 2000;  
 88                 else
 89                     p.year += 1900;
 90         
 91                 if(isRunNian(p.year))    //如果是闰年 
 92                     day[2] = 29;
 93                 else
 94                     day[2] = 28;
 95                                 
 96                 if(p.day > day[p.month])    //该月的天数要符合条件 
 97                     continue;
 98                 
 99                 if(!vis[p.year][p.month][p.day])    //避免存储重复的 
100                 {
101                     vis[p.year][p.month][p.day] = 1;
102                     v.push_back(p);
103                 }
104                 
105                 
106             }
107         }
108     }
109     
110     sort(v.begin(),v.end(), cmp);
111     
112     
113     for(int i = 0; i < v.size(); ++i)
114     {
115         printf("%d-%02d-%02d\n", v[i].year, v[i].month, v[i].day);
116     }
117     
118 
119     return 0;
120 }

 

转载于:https://www.cnblogs.com/FengZeng666/p/10543393.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值