#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 10;
int a[maxn];
int n;
int h()
{
int ans = 0;
for (int i = 0; i < n-1; i++)
{
if (a[i] + 1 != a[i+1])
ans++;
}
if (a[n - 1] != n)
ans++;
return ans;
}
bool is_sorted()
{
for (int i = 0; i < n-1; i++)
{
if (a[i]>=a[i+1])
return false;
}
return true;
}
bool dfs(int deep, int maxd)
{
if (deep * 3 + h() > maxd * 3)
return false;
if (is_sorted())
return true;
int olda[maxn], b[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(deep + 1, maxd))
return true;
memcpy(a, olda, sizeof(olda));
}
}
return false;
}
int solve()
{
if (is_sorted())
return 0;
for (int maxd = 1; maxd < 10; maxd++)
{
if (dfs(0, maxd))
return maxd;
}
return 10;
}
int main()
{
int Case = 0;
while (cin >> n&&n)
{
for (int i = 0; i < n; i++)
cin >> a[i];
cout << "Case " << ++Case << ": "<<solve() << endl;
}
//system("pause");
}
UVa11212题目链接#include <iostream>#include <cstring>using namespace std;const int maxn = 10;int a[maxn];int n;int h(){ int ans = 0; for (int i = 0; i < n-1; i++) { if (a[i] + 1 !=