Editing a Book UVA - 11212 

附一篇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());
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41776911/article/details/82454122