蓝桥杯2020年 第十一届 回文日期

问题遇到的现象和发生背景

个人想法是通过两个while循环,分别来输出 下一个回文和ABABBABA,for循环嵌套不断遍历,去找

问题点在于 第一个while循环中,最后输出的结果并不是下一个回文,比如

输入 20200202

程序会输出 21011012
          21211212
问题相关代码,请勿粘贴截图
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool bbb(int i)                           //判断ABABBABA
{
        string str=to_string(i);
    int j;

    if(str[0]==str[7]&&str[0]==str[2]&&str[2]==str[5]&&str[3]==str[1]&&str[3]==str[4]&&str[3]==str[6])
    {
        return false;
    }
    return true;
}
bool check(int i)                      //  //判断下一个回文
{
    string str=to_string(i);
    int j;

    if(str[0]==str[7]&&str[1]==str[6]&&str[2]==str[5]&&str[3]==str[4])
    {
        return false;
    }
    return true;
}
bool ccc(int i)
{
    if(i%4==0||i%100==0)
    return false;
    
    return true;
}

int main()
{
    int i=0,j,k,m,n;
    int w,e;

    bool bns=true;
    scanf("%d",&n);
    int y=n/10000;                  //年
    int x=n%10000/100;        //月
    int z=n%100;                  //日
while(1)
{
    for(j=x;j<=12;j++)
    {
        if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
        {
            for(k=z+1;k<=31;k++)
            {
                m=y*10000+j*100+k;
                        
            
                if(check(m)==false)
            {
            bns=false;
            w=j;e=k;    
                break;
                    
            }
            }
        if(bns==false)
        break;
        }
        if(j==4||j==6||j==9||j==11)
        {
            for(k=z+1;k<=30;k++)
            {
            
                    
                m=y*10000+j*100+k;
                if(check(m)==false)
            {
            bns=false;    
            w=j;e=k;
                break;
                
            }
            }
        if(bns==false)
        break;
        }
        if(j==2)
        {
            if(ccc(y)==false)
            {
            for(k=z+1;k<=28;k++)
            {
            
                    m=y*10000+j*100+k;
                if(check(m)==false)
            {
            bns=false;    
            w=j;e=k;
                break;
            
            }
            }
        if(bns==false)
        break;
        }
    else
    {
            for(k=z+1;k<=29;k++)
            {
            
                        m=y*10000+j*100+k;
            
                if(check(m)==false)
            {
            bns=false;    
            w=j;e=k;
                break;
                    
            }
            }
        if(bns==false)
        break;
     } 
    }
    }
    
        if(bns==false)
        break;
    y++;
}
    printf("%d%02d%02d",y,w,e);
    printf("\n");
    bns=true;
    while(1)
{
    for(j=x;j<=12;j++)
    {
        if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
        {
            for(k=z+1;k<=31;k++)
            {
                m=y*10000+j*100+k;
                        
            
                if(bbb(m)==false)
            {
            bns=false;
            w=j;e=k;    
                break;
                    
            }
            }
        if(bns==false)
        break;
        }
        if(j==4||j==6||j==9||j==11)
        {
            for(k=z+1;k<=30;k++)
            {
            
                    
                m=y*10000+j*100+k;
                if(bbb(m)==false)
            {
            bns=false;    
            w=j;e=k;
                break;
                
            }
            }
        if(bns==false)
        break;
        }
        if(j==2)
        {
            if(ccc(y)==false)
            {
            for(k=z+1;k<=28;k++)
            {
            
                    m=y*10000+j*100+k;
                if(bbb(m)==false)
            {
            bns=false;    
            w=j;e=k;
                break;
            
            }
            }
        if(bns==false)
        break;
        }
    else
    {
            for(k=z+1;k<=29;k++)
            {
            
                        m=y*10000+j*100+k;
            
                if(bbb(m)==false)
            {
            bns=false;    
            w=j;e=k;
                break;
                    
            }
            }
        if(bns==false)
        break;
     } 
    }
    }
    
        if(bns==false)
        break;
    y++;
}
    printf("%d%02d%02d",y,w,e);
    
    return 0;
}

两边对称,故确定一边即可确定另一边,也就是说给定年份,如果能回文,那么回文的日期部分就确定了,如果给定月日,回文的年也能确定