我们处理一件事情,遇到困难,当怀疑自己的时候,请试试想想自己曾经做这件事的初衷。。。
题目
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
分析
这题看着简单,但做起来就是一点思路也没有。。。原来是题目没看透,这只是第一道大题,我好颓废。。。
我想了好多天都没有思路,就是做不出来,看了别人的答案,也有好几个版本,但就是难下手,也不想下手,顺便找了一个人的代码,先贴上去再说,我被这题弄的好烦,我累了。。。

//#include<bits/stdc++.h>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
//日期打表
int monthNum[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
 
bool isLeap(int y){//判断是否是闰年
    return y % 400 == 0 || (y % 4 == 0 && y % 100 == 0);
}
 
bool isYear(int x){//判断是2000前,还是20年后
    if(x >= 60) return true;//如果是1960~1999之间
    else return false;//如果是2000~2059年之间
}
 
bool isMonth(int x){//判断月份是否在1~12之间
    if(x > 0 && x< 13) return true;
    else return false;
}
 
bool isDay(int year, int month, int day){//判断日期是否正确
    if(day <= monthNum[month][isLeap(year)] && day > 0)//判断日期是否是闰年,且对应月份的天数在1~合理的上限制
        return true;
    else
        return false;
}
 
struct Date{//存贮日期
    int y;
    int m;
    int d;
    Date(int _y, int _m, int _d): y(_y), m(_m), d(_d){}
};
 
vector<Date> v;
 
void judge(int x, int y , int z){
    int year = 0;
    if(isMonth(y)){//年、月、日判断
        if(isYear(x)){
            year = 1900 + x;
            if(isDay(year, y,z)){
//                date[k].y = year;
//                date[k].m = y;
//                date[k].d = z;
                v.push_back(Date(year, y, z));//动态数组存储日期
            }
        }else{
            year = 2000 + x;
            if(isDay(year, y,z)){
//                date[k].y = year;
//                date[k].m = y;
//                date[k].d = z;
                v.push_back(Date(year, y, z));
            }
        }
    }
}
 
bool cmp(const Date &a, const Date &b){
    if(a.y != b.y){
        if(a.y >= 60 && b.y >= 60){
            return a.y < b.y;
        }else{
            if(a.y >= 60 && b.y < 60) return a.y > b.y;
            else return a.y < b.y;
        }
    }else if(a.m != b.m){
        return a.m < b.m;
    }else{
        return a.d < b.d;
    }
}
 
int main(){
    int AA,BB,CC;
    scanf("%d/%d/%d", &AA, &BB, &CC);
    judge(AA,BB,CC);
    judge(CC,AA,BB);
    judge(CC,BB,AA);
    sort(v.begin(), v.end(), cmp); 
    for (int i = 0; i < v.size(); ++i) {
       if(!i){
           printf("%d-%02d-%02d\n", v[i].y, v[i].m, v[i].d);
       }else{//去重复
           if((v[i].y == v[i -1].y && v[i].m == v[i - 1].m && v[i].d == v[i - 1].d)){
               continue;
           }else{
               printf("%d-%02d-%02d\n", v[i].y, v[i].m, v[i].d);
           }
       }
    }
    return 0;
}
08-16 03:31