#include<iostream>
#include<cstring>
using namespace std;
const int maxn =
400000;
bool Vis[maxn];
int n;
int D[
10];
int kangtuo(
int A[
9])
{
int t =
0;
for (
int i =
0; i<n; i++)
{
int cnt =
0;
int x = A[i];
for (
int j = i +
1; j<n; j++)
{
if (A[j]<x) cnt++;
}
t += cnt*D[n - i -
1];
}
return t;
}
int In[
10];
void turn(
int A[
9],
int B[
9],
int l1,
int r1,
int l2,
int r2,
int &h)
{
h =
0;
int p1 = l1, p2 = l1 + (r2 - l2), p3 = r2;
for (
int i =
0; i<n; i++)
{
if (i<p1 || i>p3)
B[i] = A[i];
else if (i <= p2)
{
B[i] = A[i - p1 + l2];
}
else
{
B[i] = A[i - p2 -
1 + l1];
}
if (i>
0 && B[i -
1] != B[i]-
1) h++;
else if (i ==
0 && B[i] !=
1) h++;
}
}
bool dfs(
int cen,
int deep,
int A[
9],
int knum)
{
if (cen == deep)
{
return knum ==
0;
}
else
{
for (
int i =
0; i<n; i++)
{
for (
int j = i; j<n; j++)
{
int l = j +
1;
for (
int r = l; r<n; r++)
{
int B[
9];
int h;
turn(A, B, i, j, l, r, h);
if (
3 * (deep - cen) >= h)
{
int nknum = kangtuo(B);
{
Vis[nknum] =
1;
if (dfs(cen +
1, deep, B, nknum))
{
return true;
}
}
}
}
}
}
return false;
}
}
int main()
{
D[
0] =
1;
for (
int i =
1; i<
10; i++)
{
D[i] = D[i -
1] * i;
}
cin >> n;
for (
int i =
0; i<n; i++)
{
cin >> In[i];
}
int maxdeep = n -
1;
int ans = -
1;
int k = kangtuo(In);
for (
int i =
0; i<=maxdeep; i++)
{
memset(Vis,
0,
sizeof(Vis));
if (dfs(
0, i, In, k))
{
ans = i;
break;
}
}
cout << ans << endl;
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-669593.html