题目链接
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
int q[N],w[5][N];
int n;
int f()
{
int cnt=0;
for(int i=0;i+1<n;i++)
if(q[i+1]!=q[i]+1)
cnt++;
return (cnt+2)/3;
}
bool dfs(int depth,int max_depth)
{
if(depth+f()>max_depth)return false;
if(!f())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++)
{
memcpy(w[depth],q,sizeof q);
int i,j;
for(i=r+1,j=l;i<=k;i++,j++)q[j]=w[depth][i];
for(i=l;i<=r;i++,j++)q[j]=w[depth][i];
if(dfs(depth+1,max_depth))return true;
memcpy(q,w[depth],sizeof q);
}
}
}
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)cout<<"5 or more"<<endl;
else cout<<depth<<endl;
}
}