(一本通习题)1684:翻转序列
思路:IDA*+迭代加深
#include<bits/stdc++.h>
#define re register int
using namespace std;
int t,n,bj,deep,a[25];
int read()
{
int ans=0;
char w=' ',ch=getchar();
while(ch<'0' || ch>'9')
{
w=ch;
ch=getchar();
}
while(ch>='0' && ch<='9')
{
ans=(ans<<3)+(ans<<1);
ans+=ch-'0';
ch=getchar();
}
return w=='-'?-ans:ans;
}
void dfs(int tot,int p)
{
if(bj) return;
int sum=0;
for(re i=1;i<n;i++)
{
if(abs(a[i]-a[i+1])>1)
{
sum++;
}
}
if(tot+sum>deep)
{
return;
}
int pd=0;
for(re i=1;i<n;i++)
{
if(a[i]!=a[i+1]-1)
{
pd=1;
break;
}
}
if(!pd)
{
bj=1;
return;
}
for(re i=2;i<=n;i++)
{
if(i!=p)
{
reverse(a+1,a+1+i);
dfs(tot+1,i);
reverse(a+1,a+1+i);
}
}
}
int main()
{
t=read();
while(t--)
{
n=read();bj=0;
for(re i=1;i<=n;i++)
{
a[i]=read();
}
for(deep=0;;deep++)
{
dfs(0,0);
if(bj==1)
{
break;
}
}
printf("%d\n",deep);
}
return 0;
}