题目传送门 | |
---|---|
迭代加深+估计函数
估计函数:每次操作都能把3个错误点改正,消除所有错误点操作次数为tot/3 上取整 = (tot+2)/ 3;
#include<iostream>
using namespace std;
const int N=16;
int n,q[N];
int w[6][N];
int f()
{
int res=0;
for(int i=0;i<n-1;i++)
if(q[i]!=q[i+1]-1) res++;
res+=2;
return res/3;
}
bool judge()
{
for(int i=0;i<n-1;i++)
if(q[i]!=q[i+1]-1)
return false;
return true;
}
bool dfs(int depth,int max_depth)
{
if(depth+f()>max_depth) return false;
if(judge()) return true;
// 枚举转态;
for(int len=1;len<=n;len++)
{
for(int l=0;l+len-1<n;l++)
{
int r=l+len-1;
for(int k=r+1;k<n;k++)
{
int x,y;
memcpy(w[depth],q,sizeof q);
for(x=r+1,y=l;x<=k;x++,y++)
{
q[y]=w[depth][x];
}
for(x=l;x<=r;x++) q[y++] = w[depth][x];
if(dfs(depth+1,max_depth)) return true;
memcpy(q,w[depth],sizeof w[depth]);
}
}
}
return false;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++) cin>>q[i];
int depth=0;
while(depth<5 && !dfs(0,depth)) depth++;
if(depth>=5) puts("5 or more");
else cout<<depth<<endl;
}
return 0;
}