思路: #
暴力枚举直到现在的日期满足出现过的数字为 $2$ 种及以下。
注意当月份和天数小于 $10$ 时,需要在前面补一个 $0$,而这个 $0$ 也是需要算进出现过的数字种数里的。
统计出现过的数字种数可以使用 unordered_set,这是基于哈希表实现的无序关联容器,不会有重复的元素。
至于每月天数可以做下洛谷的这题。
代码: #
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int y,m,d,tamp;
char fuh;
unordered_set<int>se;
int day(int y,int m){
if(m==2){
if(y%4==0&&y%100!=0)return 29;
else if(y%400==0)return 29;
else{
return 28;
}
}
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)return 31;
else if(m==4||m==6||m==9||m==11)return 30;
}
bool check(){
unordered_set<int>s;
int tamp=y;
if(m<10||d<10)s.insert(0);
while(tamp){
s.insert(tamp%10);
tamp/=10;
}
tamp=m;
while(tamp){
s.insert(tamp%10);
tamp/=10;
}
tamp=d;
while(tamp){
s.insert(tamp%10);
tamp/=10;
}
if(s.size()<=2){
return 1;
}
return 0;
}
int main(){
cin>>y>>fuh>>m>>fuh>>d;
tamp=y;
if(m<10||d<10)se.insert(0);
while(tamp){
se.insert(tamp%10);
tamp/=10;
}
tamp=m;
while(tamp){
se.insert(tamp%10);
tamp/=10;
}
tamp=d;
while(tamp){
se.insert(tamp%10);
tamp/=10;
}
if(se.size()<=2){
printf("%d/%02d/%02d",y,m,d);
// cout<<y<<"/"<<m<<"/"<<d;
}
else{
while(1){
if(d-1==day(y,m)){
d=1;m++;
}
if(m==13){
y++;m=1;
}
if(check()){
printf("%d/%02d/%02d",y,m,d);//cout<<y<<"/"<<m<<"/"<<d;
break;
}
d++;
}
}
cout<<"\n";
return 0;
}