UVa-11212 Editing a Book

 1 #include <bits/stdc++.h>
 2 #define _for(i,a,b) for(int i = (a);i < (b);i ++)
 3 #define pb push_back
 4 #define is sizeof(int)
 5 
 6 using namespace std; 
 7 const int maxn = 9;
 8 
 9 int n;
10 int maxd;
11 int v[maxn];
12 
13 int readint() {int tmp;scanf("%d",&tmp);return tmp;}
14 void read()
15 {
16     int vend = 0;
17     _for(i,0,n)
18         v[vend++] = readint();
19 }
20 
21 int wnc()//wrong number count
22 {
23     int cnt = 0;
24     _for(i,1,n)
25         if(v[i-1]+1!=v[i])
26             cnt ++;
27     return cnt;
28 }
29 
30 bool dfs(int d)
31 {
32     if(3*d+wnc()>3*maxd) return false;
33     if(wnc()==0) return true;
34     int vv[maxn];
35     memcpy(vv,v,sizeof(v));
36     int tmp[maxn];
37     _for(i,0,n)//confirm the beginning
38     {
39         if(i==0 || vv[i] != vv[i-1]+1)
40         {
41             _for(j,i,n)
42             {
43                 while(j+1<n && vv[j+1]==vv[j]+1) j++;
44                 memcpy(tmp,vv+i,is*(j-i+1));//move part
45                 _for(k,j+1,n)
46                 {
47                     while(k+1<n && vv[k+1]==vv[k]+1) k++;
48                     memcpy(v+i,vv+j+1,is*(k-j));
49                     memcpy(v+i+(k-j),tmp,is*(j-i+1));
50                     if(dfs(d+1))return true;
51                     memcpy(v,vv,sizeof(v));
52                 }
53             }
54         }
55     }
56     return false;
57 }
58 
59 int solve()
60 {
61     if(wnc()==0)    return 0;
62     for(maxd = 1; ;maxd ++)
63     {
64         if(dfs(0)) break;
65     }
66     return maxd;
67 }
68 
69 int kase = 1;
70 void output(int rnt)
71 {
72     printf("Case %d: %d
",kase++,rnt);
73 }
74 
75 int main()
76 {
77     while(~scanf("%d",&n)&&n!=0)
78     {
79         memset(v,0,sizeof(v));
80         read();
81         output(solve());
82     }
83     return 0;
84 }