#include<cstdio>#include<cstring>usingnamespacestd;
int s[10];//状态空间搜索int n;
int h() //后续不正确排列数字个数
{
int cnt = 0;
for (int i = 0; i < n - 1; i++)
if (s[i] + 1 != s[i + 1])
cnt++;
if (s[n - 1] != n)
cnt++;
return cnt;
}
bool is_sorted()
{
for (int i = 0; i < n - 1; i++)
if (s[i] >= s[i + 1]) returnfalse;
returntrue;
}
bool dfs(int d, int maxd)//IDA*基于DFS //DFS需返回bool //d与maxd作为参数用作剪枝
{
if (is_sorted())
returntrue;
if (d * 3 + h() > maxd * 3) //每次剪切h最多减少3,不满足则剪枝//IDA*剪枝returnfalse;
int b[10], tmp[10];
memcpy(tmp, s, sizeof(s));
for (int i = 0; i < n; i++)
for (int j = i; j < n; j++) {
// cutint cnt = 0;
for (int k = 0; k < n; k++)
if (k < i || k > j)
b[cnt++] = s[k];
// insert before position kfor (int k = 0; k <= cnt; k++) {
int cnt2 = 0;
for (int p = 0; p < k; p++)
s[cnt2++] = b[p];
for (int p = i; p <= j; p++)
s[cnt2++] = tmp[p];
for (int p = k; p < cnt; p++)
s[cnt2++] = b[p];
if (dfs(d + 1, maxd)) //用if递归退出returntrue;
memcpy(s, tmp, sizeof(s));//基于dfs的IDA*不必编号,但需在回溯后回复状态
}
}
returnfalse;
}
int solve()
{
if (is_sorted()) //不用处理,输入数据已满足条件return0;
int max_ans = 5; // after experiments, we found ans <= 5 for n <= 9for (int maxd = 1; maxd < max_ans; maxd++) //IDA*迭代加深
{
if (dfs(0, maxd))
return maxd;//搜索成功一定达到了maxd,因此返回maxd
}
return max_ans;
}
int main()
{
int kase = 0;
while (scanf("%d", &n) && n)
{
for (int i = 0; i < n; i++)
{
scanf("%d", &s[i]);
}
printf("Case %d: %d\n", ++kase, solve());
}
}