题解
比较简单的模拟,注意这个环的条件比较苛刻。
感觉自己写代码还是不够仔细,没有想清楚就动手,花了好多时间debug。
Code
#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <string>
#include <cstdlib>
using namespace std;
int n,m;
int cot[15];
int vis[10];
int val[10];
int num_size=0;
void num2arr(unsigned long num){// turn num into array
int pos = 0;
while(num!=0){
cot[pos++] = num%10;
num/=10;
}
num_size = pos;
}
bool status(){ // detect whether current movement is valid
for(int i=1;i<=9;i++)
if( vis[i] >= 2)
return false;
return true;
}
bool Cyc(){// whether our track is a cycle
if( vis[ cot[num_size-1]]!=2 ) return false;
int sum=0,pro=1;
for(int i=0;i<num_size;i++){
sum+=vis[ cot[i] ];
pro*=vis[ cot[i] ];
}
if( pro == 2 && sum == num_size+1 ) return true;
else return false;
}
bool val_num(){// whether this num is valid : not 0s not duplicate
memset(val,0,sizeof(val));
for(int i=0;i<num_size;i++){
val[cot[i]]++;
}
if(val[0] > 0) return false;
for(int i=1;i<10;i++){
if(val[i]>1) return false;
}
return true;
}
bool isCyc(){// imitate the movement
int pos = num_size-1;
while( status() ){
vis[ cot[pos] ] ++;
pos -= cot[pos];
while(pos<0)
pos +=num_size;
pos %= num_size;
}
if(Cyc()) return true;
return false;
}
int main(void){
freopen("runround.out","w",stdout);
freopen("runround.in","r",stdin);
unsigned long nn;
cin>>nn;
nn++;
num2arr(nn);
while( !val_num() || !isCyc() ){
nn++;
num2arr(nn);
memset(vis,0,sizeof(vis));
}
cout<<nn<<endl;
return 0;
}