分析
- 对,天数和月份必须大于零
C++ 见注释
#include<bits/stdc++.h>
using namespace std;
//Tools
#define ffor(i,s,e) for(int i=s;i<e;i++)
#define out(x) cout<<x<<" "
#define nl cout<<endl //nextline
//vars
vector<int> adj[3];
int vised[102];//记录每个数的次数
map<string,int> allans;
const int month[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31
};
//fun
void init();//读入邻接表
bool check29(string date);//判断合法性
void dfs(int ,string );//组合日期
int main(){
// out(check29("2008-06-31"));nl;
// check29("2008-02-31");
init();
string ans;
dfs(0,ans);
for(auto it=allans.begin();it!=allans.end();it++){
cout<<it->first<<endl;
}
return 0;
}
void init(){
int a[3];
scanf("%d/%d/%d",&a[0],&a[1],&a[2]);
ffor(i,0,3){
int now=a[i];
vised[now]++;
if(i!=1)//中间不能是年
adj[0].push_back(now);
if(i!=2&&now&&now<13)//末尾不能是月份
adj[1].push_back(now);
if(now&&now<32)
adj[2].push_back(now);
}
/*验证结果
ffor(i,0,3){
for(auto x:adj[i]) out(x);
nl;
}*/
}
bool check29(string str){
int year=atoi(str.substr(0,4).c_str());
int mon=atoi(str.substr(5,2).c_str());
int day=atoi(str.substr(8,2).c_str());
// cout<<year<<"-"<<mon<<"-"<<day<<endl;
bool has29=!(year%400)||(year%4==0)&&(year%100);
// out(has29);nl;
if(mon==2){
if(has29) return day<=29;
else return day<=28;
}
return day<=month[mon];
}
void dfs(int lev,string ans){
if(lev==3){
//cout<<ans<<endl;
//map自己就能完成去重和排序
if(allans.count(ans)==0&&check29(ans)){
allans[ans]=1;
}
return ;
}
int n=adj[lev].size();
ffor(i,0,n){
int t=adj[lev][i];
if(vised[t]>0){
string now=to_string(t);
switch(lev){
case 0:
vised[t]--;
if(t>59){
dfs(lev+1,ans+"19"+now+"-");
}else{
if(t<10) now="0"+now;//补上单个零
dfs(lev+1,ans+"20"+now+"-");
}
vised[t]++;//恢复现场,必要
break;
case 1:
vised[t]--;
if(t<10) now="0"+now;
dfs(lev+1,ans+now+"-");
vised[t]++;
break;
case 2:
vised[t]--;
if(t<10) now="0"+now;
dfs(lev+1,ans+now);
vised[t]++;
break;
default:
break;
}
}
}
}