蓝桥杯——回文日期

//本身没什么难度,主要是对C++的熟悉
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector<int> getNum(string date){
    
    
  vector<int> res;
  for(int i=0;i<date.size();i++){
    
    
    res.push_back(date[i]-'0');
  }
  return res;
}
vector<int> getYear(int num){
    
    
  vector<int> year(4,0);
  int t=0;
  int i=3;
  while(num!=0){
    
    
    t=num%10;
    year[i]=t;
    num=(num-t)/10;
    i--;
  }
  return year;
}
bool check(vector<int> a,vector<int> b){
    
    
  //检查日期是否合法
  if(b[4]>1||(b[5]>2&&b[4]==1)||(b[4]==0&&b[5]==0)||b[6]>3||(b[7]==0&&b[6]==0)){
    
    
    return false;
  }
  //检查月份
  for(int i=0;i<=7;i++){
    
    
    if(a[i]>b[i]){
    
    
      return false;
    }else if(b[i]>a[i]){
    
    
      return true;
    }
  }
  return false;
}
int getDate(vector<int> &date){
    
    
  int res=0;
  for(int i=0;i<date.size();i++){
    
    
    res=10*res+date[i];
  }
  return res;
}
vector<int> getRes(int year){
    
    
  //根据年费构造回文
  vector<int> a=getYear(year);
  vector<int> res=a;
  for(int i=3;i>=0;i--){
    
    
    res.push_back(a[i]);
  }
  return res;
}
bool checkAB(vector<int> time){
    
    
  //判断是否为ABAB
  int A=time[0];
  int B=time[1];
  for(int i=0;i<=2;i=i+2){
    
    
    if(!(time[i]==A&&time[i+1]==B)){
    
    
        return false;
    }
  }
  for(int i=4;i<=6;i=i+2){
    
    
    if(!(time[i]==B&&time[i+1]==A)){
    
    
        return false;
    }
  }
  return true;
}
int main()
{
    
    
  // 请在此输入您的代码
  string date;
  cin>>date;
  //获得时间
  vector<int> time=getNum(date);
  vector<int> initTime=time;
  int year=time[0]*1000+time[1]*100+time[2]*10+time[3];
  vector<int> yearTime=getYear(year);
  //在年份不变的情况下变为回文
  bool flag=true;
  int l=3;
  int r=4;
  while(l>=0){
    
    
    if(time[l]==time[r]){
    
    
      l--;
      r++;
      continue;
    }
    flag=false;
    time[r]=time[l];
  }
  int res1;
  int res2;

  //寻找第一个回文
  if(!flag){
    
    
    if(check(initTime,time)){
    
    
      //合法即发现第一个回文
      res1=getDate(time);
    }else{
    
    
      //不合法就对年份修改依次寻找回文
      flag=true;
    }
  }
  if(flag)
  {
    
    
    //对年份修改寻找回文
    year++;
    while(true){
    
    
      time=getRes(year);
      if(check(initTime,time)){
    
    
        res1=getDate(time);
        break;
      }
      year++;
    }
  }

  //寻找ABAB型号的回文
  if(check(initTime,time)&&checkAB(time)){
    
    
    res2=getDate(time);
  }else{
    
    
    year++;
    while(true){
    
    
      time=getRes(year);
      if(check(initTime,time)&&checkAB(time)){
    
    
        res2=getDate(time);
        break;
      }
      year++;
    }
  }
  cout<<res1<<endl;
  cout<<res2<<endl;

  
  return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_33880925/article/details/129231941