题解 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;
}