算出位置公式,然后直接模拟就可以,代码写的比较不整齐,好久不写的原因 analysis里面居然给出了打表的方式,USACO不是禁止这样么
1 /* ID:linyvxi1
2 PROB:runround
3 LANG:C++
4 */
5 #include <stdio.h>
6 int div_num[33];
7 bool visited[33]={false};
8 int len=0;
9 bool trans(int n)
10 {
11 int j=0;
12 int div_cpy[33];
13 bool num[10]={false};
14 while(n){
15 div_cpy[j]=n%10;
16 if(div_cpy[j]==0||num[n%10]){
17 return true;
18 }
19 num[n%10]=true;
20 div_num[j++]=n%10;
21
22 n/=10;
23 }
24 len=j-1;
25 for(j=0;j<=len;j++){
26 div_num[j]=div_cpy[len-j];
27 }
28 return false;
29 }
30 bool check()
31 {
32 int i;
33 for(i=0;i<=len;i++){
34 if(!visited[i])
35 return false;
36 }
37 return true;
38 }
39 int main()
40 {
41 freopen("runround.in","r",stdin);
42 freopen("runround.out","w",stdout);
43 int n;
44 scanf("%d",&n);
45 int k;
46 for(k=n+1;;k++){
47 if(trans(k)){
48 continue;
49 }
50 int i=0;
51 for(i=0;i<len;i++){
52 visited[i]=false;
53 }
54 visited[0]=true;
55 int cur_num=div_num[0];
56 int cur_pos=0;
57 for(i=0;i<=len;i++){
58 cur_pos=(cur_pos+cur_num%(len+1))%(len+1);
59 cur_num=div_num[cur_pos];
60 visited[cur_pos]=true;
61 }
62 if(check()&&cur_pos==0){
63 printf("%d\n",k);
64 break;
65 }
66 }
67 }