#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class Board
{
public:
int a[16];
int h;
int n;
bool readIn()
{
int i;
scanf("%d",&n);
if(n == 0) return false;
for(i=0;i<n;i++)
scanf("%d",a+i);
return true;
}
void move(int s,int e,int p)
{
int t[16],i,j;
if(p<s)
{
for(i=0; i<p; i++)
t[i]=a[i];
for(j=s; j<=e; j++,i++)
t[i]=a[j];
for(j=p;j<s;j++,i++)
t[i]=a[j];
for(j=e+1;j<n;j++,i++)
t[i]=a[j];
}
else
{
for(i=0;i<s;i++)
t[i]=a[i];
for(j=e+1;j<p;j++,i++)
t[i]=a[j];
for(j=s;j<=e;j++,i++)
t[i]=a[j];
for(j=p;j<n;j++,i++)
t[i]=a[j];
}
memcpy(a,t,sizeof(t));
}
int getH()
{
int cnt,i;
cnt=0;
for(i=0;i<n-1;i++)
{
if(a[i+1]!=a[i]+1)
cnt++;
}
if(a[i]!=n)
cnt++;
h=cnt;
return cnt;
}
};
int lim;
int f(int dep,int h)
{
return dep*3+h;
}
bool IDDFS(int dep,Board b)
{
int i,j,k;
Board tb;
b.getH();
if(f(dep, b.h) > lim*3)
return false;
if(b.getH()==0)
return true;
for(i=0;i<b.n;i++)
{
for(j=i;j<b.n;j++)
{
for(k=0;k<i;k++)
{
tb=b;
tb.move(i,j,k);
if(IDDFS(dep+1,tb)==true)
return true;
}
for(k=j+2;k<b.n;k++)
{
tb=b;
tb.move(i,j,k);
if(IDDFS(dep+1,tb)==true)
return true;
}
}
}
return false;
}
int main()
{
Board b;
int prob;
prob=1;
while(b.readIn()==true)
{
for(lim=0; ; lim++){
if(IDDFS(0,b)==true)
break;
}
printf("Case %d: %d\n",prob, lim);
prob++;
}
return 0;
}
UVa11212 - Editing a Book
最新推荐文章于 2021-03-22 20:37:55 发布