洛谷 题解 P1467 【循环数 Runaround Numbers】

eh...我把这道题做成了搜索!

主要思路:从输入的数+1开始,不断往上循环,判断该数是否为循环数。

这道题主要考验你的耐心,看起来容易,做起来难!

话不多说,奉上AC代码(注释均在代码内)

#include<iostream>
using namespace std;
int x;
int cnt;
int old_num[12],num[12];
bool ans[12];
void statistics(int a)//统计该数的数位长度和各个数位
{
    cnt=0;
    while(a!=0)
    {
        cnt++;
        old_num[cnt]=a%10;
        a/=10;
    }
}
bool all()//判断每一位是否都遍历过了
{
    for(int i=1;i<=cnt;i++)
    {
        if(!ans[i])
            return false;
    }
    return true;
}
bool dfs(int pointer)
{
    int far;//指循环到的下一位
    far=(pointer+num[pointer])%cnt;
    if(far==0)
        far=cnt;
    if(far==1&&all())//全部遍历过且下一位是第一位,就是循环数
        return true;
    if(far==1&&!all())//虽然下一位是第一位但是并没有把每一位全部遍历,还不是循环数
        return false;
    if(ans[far]==true)//如果下一位不是第一位但是下一位已经遍历过,不是循环数
        return false;
    ans[far]=true;//指下一位被遍历
    dfs(far);//搜索下一位
}
int main()
{
    cin>>x;
    for(int i=x+1;;i++)
    {
        int flag=0;
        statistics(i);
        int f=cnt;
        for(int j=1;j<=cnt;j++)
        {
            num[j]=old_num[f];
            f--;
        }//将逆序改为正序
        for(int j=1;j<=cnt;j++)
        {
            if(num[j]==0)
            {
                flag=1;
                break;
            }
            for(int k=1;k<j;k++)
            {
                if(num[j]==num[k])//判断其中每一位是否都不重复
                {
                    flag=1;
                    break;
                }
            }
            if(flag)
               break;
        }
        if(flag)
            continue;
        else
        {
            ans[1]=true;
            if(dfs(1))
            {
                cout<<i;
                break;
            }
        }
        for(int j=1;j<=cnt;j++)
        {
            old_num[j]=0;
            num[j]=0;
            ans[j]=0;
        }//注意一定要清零!!!
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zyh-cr7/p/12237250.html