题解 P1467 【循环数 Runaround Numbers】

· · 题解

千万要记住while(1) 不要while(n)

不然会t的

暴力+剪枝

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int b[200],l,visit[200],a[200];
int zhuan(int x)
{
    int t=0;
    while(x>0)
    {
        b[++t]=x%10;
        x/=10;
    }
    for(int i=1;i<=t;++i)a[i]=b[t-i+1];//逆序存进去 
    return t;//长度 
}
bool you()
{
    int t=1;//开始的位置 
    memset(visit,0,sizeof visit);//每一次都memset一遍 
    for(int i=1;i<=l;++i)
    {
        if(visit[a[t]]||a[t]==0)return 0;//走过就会有环;零也不行; 
        visit[a[t]]++;//走过了; 
        t=(t+a[t])%l;//走到下一位上; 
        if(t==0)t=l;//最后一个就是l; 
    }
    if(t!=1)return 0;//没走到原来的辣个位置当然就"挂了"; 
    return 1;
}
int main()
{
    int ok;
    scanf("%d",&ok);
    while(233)
    {
        ok++;
        l=zhuan(ok);
        if(you())
        {
            printf("%d",ok);
           return 0;
        }
    }
    return 0;
}