题目大意:给你一个数字串,包含1~n的n个(n<=9)不重复正整数字串要你把字串通过剪切粘贴的方式把给定的字串变成1,2.。。n。输出要几步剪贴。例子:给定3,1,2,4,5.要求你通过剪贴的方式弄出1,2,3,4,5.则把初始串中1,2剪贴到3前即可,所以最少1步。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n;
int maxd=0; //最大深度
int geth (int N[]){
int num=0;
for (int i=1;i<=n-1;i++)
if (N[i+1]-N[i]!=1)num++;
return num;
}
void move(int s[],int t[],int left,int right,int to){
memcpy(t+to,s+left,(right-left+1)*sizeof(int));
memcpy(t+(right-left)+to+1,s+to,(left-to)*sizeof(int));
}
bool isget(int s[]){
for (int i=1;i<=n;i++){
if(s[i]!=i) return false;
}
return true;
}
bool isok(int s[],int d){//
int temp[10];
int left=1,right,to;
if (d==maxd)
{if (isget(s)) return true;
else
return false;
}
for (left=1;left<=n;left++)
{
for(right=left;right<=n;right++)
{
for(to=1;to<left;to++)
{
memcpy(temp+1,s+1,n*sizeof(int));
move(s,temp,left,right,to);
int h=geth(temp);
if((3*d+3+h)<=3*maxd) {
if(isok(temp,d+1)) return true;
}
}
}
}
return false;
}
int main(){
//n,maxd 为全局变量
maxd=0;
int s[10];
cin >> n;
for (int i=1;i<=n;i++){
scanf ("%d",&s[i]);
}
while(!isok(s,0)&&maxd<=8) {
maxd++;
}
printf("%d",maxd);
return 0;
}