#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=9;
int n,a[maxn];
bool is_sorted(){
for(int i=0;i<n-1;i++)
if(a[i]+1!=a[i+1]) return false;
return true;
}
int h(){// 估价函数 后继不正确的数字个数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 maxd){
if(3*d+h()>3*maxd) return false;//每次cut之后h最多减少3
if(is_sorted()) return true;
int b[maxn],olda[maxn];
memcpy(olda,a,sizeof a );//先保存a
for(int i=0;i<n;i++)
for(int j=i;j<n;j++){ //cut操作
int cnt=0;
for(int k=0;k<n;k++)
if(k<i||k>j) b[cnt++]=a[k]; // insert before position k
for(int k=0;k<=cnt;k++){
int cnt2=0;
for(int p=0;p<k;p++) a[cnt2++]=b[p];
for(int p=i;p<=j;p++) a[cnt2++]=olda[p];
for(int p=k;p<cnt;p++) a[cnt2++]=b[p];
if(dfs(d+1,maxd)) return true;
memcpy(a,olda,sizeof a); //在dfs后还原a
}
}
return false;
}
int solve(){
if(is_sorted()) return 0;
int max_ans=5;// 当 n <= 9,ans <= 5
for(int maxd=1;maxd<max_ans;maxd++)
if(dfs(0,maxd)) return maxd;
return max_ans;
}
int main(){
//freopen("datain.txt","r",stdin);
int kase=0;
while(scanf("%d",&n)&&n){
for(int i=0;i<n;i++) scanf("%d",&a[i]);
printf("Case %d: %d\n",++kase,solve());
}
}
UVA11212 编辑书稿 IDA*
猜你喜欢
转载自blog.csdn.net/hanker99/article/details/85636418
今日推荐
周排行