1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<cstdio> #include<cstring> const int maxn=9; int a[maxn],n,maxd; int h(){ int cnt=0; for(int i=0;i<n-1;++i) if(a[i]+1!=a[i+1]) ++cnt; if(a[n-1]!=n) ++cnt; return cnt; } bool dfs(int d){ int cnt=h(); if(d*3+cnt>maxd*3) return false; if(!cnt) return true; int b[maxn],c[maxn]; memcpy(b,a,sizeof(a)); for(int i=0;i<n;++i) for(int j=i;j<n;++j){ int cnt1=j-i+1,cnt2=n-cnt1; memcpy(c,b,sizeof(int)*(i)); memcpy(c+i,b+j+1,sizeof(int)*(n-j)); for(int k=0;k<=cnt2;++k){ if(i==k) continue; memcpy(a,c,sizeof(int)*k); memcpy(a+k,b+i,sizeof(int)*cnt1); memcpy(a+k+cnt1,c+k,sizeof(int)*(n-cnt1-k)); if(dfs(d+1)) return true; } } memcpy(a,b,sizeof(a)); return false; } int main(){ int t=0; while(~scanf("%d",&n)&&n){ for(int i=0;i<n;++i) scanf("%d",&a[i]); for(maxd=0;;++maxd) if(dfs(0)) break; printf("Case %d: %d\n",++t,maxd); } return 0; }
|