题目描述:给定一个序列(数字为1-n),求最少操作次数使序列成上升顺序。可以一段整体移动到另一个位置去。
样例:输入
6
2 4 1 5 3 6
5
3 4 5 1 2
0
输出
Case 1: 2
Case 2: 1
#include <iostream>
#include <cstdio>
using namespace std;
int n ,cnt ,a[15] ,ans ;
int mass(int a[])
{
int out=0;
for(int i=1;i<n;++i)
if(a[i]+1!=a[i+1])
++out;
return out;
}
bool dfs(int dep)
{
if(dep==ans)
{
if(mass(a))
return 0;
return 1;
}
if(mass(a)+3*dep>3*ans)return 0;
int b[15] ,old[15] ,lenb ,lena ;
for(int i=1;i<=n;++i)old[i]=a[i];
for(int i=1;i<=n;++i)
{
for(int j=i;j<=n;++j)
{
lenb=0;
for(int k=1;k<=n;++k)
if(k<i||k>j)
b[++lenb]=old[k];
for(int k=1;k<=lenb;++k)
{
lena=0;
for(int l=1;l<=k;++l)a[++lena]=b[l];
for(int l=i;l<=j;++l)a[++lena]=old[l];
for(int l=k+1;l<=lenb;++l)a[++lena]=b[l];
if(dfs(dep+1))
return 1;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
printf("Case %d: ",++cnt);
ans=mass(a)/3;
while(!dfs(0))
++ans;
printf("%d\n",ans);
}
return 0;
}