附一篇IDA*算法的总结,比较简略,https://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5856756
另附一篇A*算法的讲解https://blog.csdn.net/hitwhylz/article/details/23089415
代码参考紫书代码仓库
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#pragma warning(disable:4996)
using namespace std;
const int MAXN = 9;
int a[MAXN], n;
bool ok()
{
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 maxn)
{
if (3 * d + h() > 3 * maxn) return false;
if (ok()) return true;
int mem[MAXN], b[MAXN];
memcpy(mem, 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 cnt1 = 0;
for (int p = 0; p < k; p++) a[cnt1++] = b[p];
for (int p = i; p <= j; p++) a[cnt1++] = mem[p];
for (int p = k; p < cnt; p++) a[cnt1++] = b[p];
if (dfs(d + 1, maxn)) return true;
memcpy(a, mem, sizeof(mem));
}
}
}
return false;
}
int solve()
{
if (ok()) return 0;
for (int i = 1; i < 5; i++) {
if (dfs(0, i)) return i;
}
return 5;
}
int main()
{
for (int kcase = 1; scanf("%d", &n); kcase++)
{
if (!n) break;
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
printf("Case %d: %d\n", kcase, solve());
}
}