// by BNU_LZM
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10;
int n, a[maxn];
bool check()
{
for(int i = 0; i < n-1; i++)
if(a[i] > a[i+1]) return false;
return true;
}
int h()
{
int cnt = 0;
for(int i = 0; i < n-1; i++)
if(a[i]+1 != a[i+1]) cnt++;
if(a[n-1] != n) cnt++;
return cnt;
}
bool dfs(int d, int maxd)
{
if(check()) return true;
if(d == maxd) return false;
if(3*(maxd-d) < h()) return false;
int b[maxn], olda[maxn];
memcpy(olda, a, sizeof(a));
for(int i = 0; i < n; i++)
{
for(int j = i; j < n; j++)
{
int cnt = 0;
for(int k = 0; k < n; k++)
if(k < i || k > j) b[cnt++] = a[k];
for(int k = 0; k <= cnt; k++)
{
int cnt2 = 0;
for(int p = 0; p < k; p++) a[cnt2++] = b[p];
for(int p = i; p <= j; p++) a[cnt2++] = olda[p];
for(int p = k; p < cnt; p++) a[cnt2++] = b[p];
if(dfs(d+1, maxd)) return true;
}
memcpy(a, olda, sizeof(olda));
}
}
return false;
}
int solve()
{
if(check()) return 0;
for(int maxd = 1; maxd < 8; maxd++)
{
if(dfs(0, maxd)) return maxd;
}
return 8;
}
int main()
{
while(scanf("%d", &n) == 1 && n)
{
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
printf("%d\n", solve());
}
return 0;
}
编辑书稿
最新推荐文章于 2019-09-07 16:12:06 发布