#include<cstdio>
#include<cstring>
using namespace std;
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]) return false;
return true;
}
bool dfs(int d, int maxd)//IDA*基于DFS //DFS需返回bool //d与maxd作为参数用作剪枝
{
if (is_sorted())
return true;
if (d * 3 + h() > maxd * 3) //每次剪切h最多减少3,不满足则剪枝//IDA*剪枝
return false;
int b[10], tmp[10];
memcpy(tmp, s, sizeof(s));
for (int i = 0; i < n; i++)
for (int j = i; j < n; j++) {
// cut
int cnt = 0;
for (int k = 0; k < n; k++)
if (k < i || k > j)
b[cnt++] = s[k];
// insert before position k
for (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递归退出
return true;
memcpy(s, tmp, sizeof(s));//基于dfs的IDA*不必编号,但需在回溯后回复状态
}
}
return false;
}
int solve()
{
if (is_sorted()) //不用处理,输入数据已满足条件
return 0;
int max_ans = 5; // after experiments, we found ans <= 5 for n <= 9
for (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());
}
}
Editing a Book UVA - 11212(IDA*)
最新推荐文章于 2019-02-12 13:03:00 发布