AcWing 1229. 日期问题
模拟 枚举
解法一:
版本一:使用
sort() 和 unique() 的第三个参数
、使用
自定义函数
, 即:通过bool cmp_sort(Date& date1, Date& date2);
和bool cmp_unique(Date& date1, Date& date2);
配合sort(date, date + cnt, cmp_sort);
和unique(date, date + cnt, cmp_unique);
#include <iostream> #include <algorithm> using namespace std; int cnt = 0; struct Date { int y, m, d; // bool operator<(const Date& date) const // { // return y == date.y ? (m == date.m ? d < date.d : m < date.m) : y < date.y; // } // bool operator==(const Date& date) const // { // return y == date.y && m == date.m && d == date.d; // } }date[6]; bool cmp_sort(Date& date1, Date& date2) { return date1.y == date2.y ? (date1.m == date2.m ? date1.d < date2.d : date1.m < date2.m) : date1.y < date2.y; } bool cmp_unique(Date& date1, Date& date2) { return date1.y == date2.y && date1.m == date2.m && date1.d == date2.d; } int days[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; void get(int y, int m, int d) { if (!m || m > 12) return; if (!d) return; if (m != 2) { if (d > days[m]) return; } else { int leap = (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0); if (d > 28 + leap) return; } if (y >= 60) y += 1900; else y += 2000; date[cnt ++] = {y, m, d}; } int main() { int a, b, c; scanf("%d/%d/%d", &a, &b, &c); get(a, b, c); get(c, b, a); get(c, a, b); // 排序 sort(date, date + cnt, cmp_sort); // 去重 int n = unique(date, date + cnt, cmp_unique) - date; for (int i = 0; i < n; i ++ ) printf("%d-%02d-%02d\n", date[i].y, date[i].m, date[i].d); return 0; }
版本二:不使用
sort() 和 unique() 的第三个参数
、使用
struct 运算符重载函数
, 即:通过Date结构体
的成员函数
bool operator<(const Date& date) const
和bool operator==(const Date& date) const
配合sort(date, date + cnt);
和unique(date, date + cnt)
#include <iostream> #include <algorithm> using namespace std; int cnt = 0; struct Date { int y, m, d; bool operator<(const Date& date) const { return y == date.y ? (m == date.m ? d < date.d : m < date.m) : y < date.y; } bool operator==(const Date& date) const { return y == date.y && m == date.m && d == date.d; } }date[6]; // bool cmp_sort(Date& date1, Date& date2) // { // return date1.y == date2.y ? (date1.m == date2.m ? date1.d < date2.d : date1.m < date2.m) : date1.y < date2.y; // } // bool cmp_unique(Date& date1, Date& date2) // { // return date1.y == date2.y && date1.m == date2.m && date1.d == date2.d; // } int days[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; void get(int y, int m, int d) { if (!m || m > 12) return; if (!d) return; if (m != 2) { if (d > days[m]) return; } else { int leap = (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0); if (d > 28 + leap) return; } if (y >= 60) y += 1900; else y += 2000; date[cnt ++] = {y, m, d}; } int main() { int a, b, c; scanf("%d/%d/%d", &a, &b, &c); get(a, b, c); get(c, b, a); get(c, a, b); // 排序 sort(date, date + cnt); // 去重 int n = unique(date, date + cnt) - date; for (int i = 0; i < n; i ++ ) printf("%d-%02d-%02d\n", date[i].y, date[i].m, date[i].d); return 0; }
AcWing 1229. 日期问题