蛮简单的题,直接枚举就行了,稍微剪枝,注意数字不能重复出现并且没有0.下面贴出代码,以作纪念。
View Code
1 /*{ 2 ID:jzy3209981 3 PROG:runround 4 LANG:C++ 5 }*/ 6 #include<stdio.h> 7 #include<iostream> 8 #include<string.h> 9 #include<math.h> 10 using namespace std; 11 12 13 int move(char *fin,int n,int len) 14 { 15 switch(fin[n]) 16 { 17 case '1':return (n+1)%len; 18 case '2':return (n+2)%len; 19 case '3':return (n+3)%len; 20 case '4':return (n+4)%len; 21 case '5':return (n+5)%len; 22 case '6':return (n+6)%len; 23 case '7':return (n+7)%len; 24 case '8':return (n+8)%len; 25 case '9':return (n+9)%len; 26 } 27 return 0; 28 } 29 30 int main() 31 { 32 freopen ("runround.in","r",stdin); 33 freopen ("runround.out","w",stdout); 34 int o,len,i=0,now,j,s,p; 35 char oringe[15]; 36 int sign[15]; 37 int digit[10]; 38 scanf("%d",&o); 39 sprintf(oringe,"%d",o); 40 len=strlen(oringe); 41 o++; 42 if(oringe[0]-48==len||len==1) 43 { 44 for(i=1;i<=len+1;i++) 45 oringe[i-1]=i+48; 46 oringe[i-1]=NULL; 47 memset(sign,0,sizeof(sign)); 48 o=atoi(oringe); 49 len++; 50 } 51 for(j=o;;j++) 52 { 53 sprintf(oringe,"%d",j); 54 len=strlen(oringe); 55 memset(digit,0,sizeof(digit)); 56 p=0; 57 for(i=0;i<len;i++) 58 { 59 digit[oringe[i]-48]++; 60 if(digit[oringe[i]-48]>1||oringe[i]=='0') 61 p=1; 62 } 63 if(p==1) 64 continue; 65 s=0; 66 i=0; 67 memset(sign,0,sizeof(sign)); 68 now=move(oringe,0,len); 69 while(1) 70 { 71 if(sign[now]!=0&&i!=len) 72 { 73 s=1; 74 break; 75 } 76 else if(sign[now]==0) 77 { 78 sign[now]++; 79 i++; 80 now=move(oringe,now,len); 81 } 82 else if(sign[now]!=0&&i==len) 83 { 84 s=2; 85 break; 86 } 87 } 88 if(s==2) 89 break; 90 else if(s==1) 91 continue; 92 } 93 printf("%d\n",j); 94 return 0; 95 }

浙公网安备 33010602011771号