IDA* 估价函数的疑惑
查看原帖
IDA* 估价函数的疑惑
685604
Neovim楼主2023/1/2 10:23

估价函数如果不判断那个 * 跑出来的答案将会是 8,而跳过那个 * 跑出来的结果就是 7,这是为啥?

#include <bits/stdc++.h>
using namespace std;

int n = 5;
char g[6][6];
char target[6][6] =
{
	"11111",
	"01111",
	"00*11",
	"00001",
	"00000"
};

int f()
{
	int cnt = 0;
	for (int i = 0; i < n; i ++ )
		for (int j = 0; j < n; j ++ )
			if (g[i][j] != target[i][j] && g[i][j] != '*') // 加上这个判断 g[i][j] != '*' 才是正确的,不然答案总是大 1
				cnt ++ ;
	return cnt;
}
int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[] = {1, 2, 2, 1, -1, -2, -2, -1};

bool dfs(int depth, int max_depth)
{
	if (depth + f() > max_depth) return false;
	if (f() == 0) return true;
	int x, y;
	for (int i = 0; i < n; i ++ )
		for (int j = 0; j < n; j ++ )
			if (g[i][j] == '*')
				x = i, y = j;
	for (int i = 0; i < 8; i ++ )
	{
		int a = x + dx[i], b = y + dy[i];
		if (a < 0 || a >= n || b < 0 || b >= n) continue;
		swap(g[x][y], g[a][b]);
		if (dfs(depth + 1, max_depth)) return true;
		swap(g[x][y], g[a][b]);
	}
	return false;
}

int main()
{
	int tt;
	cin >> tt;
	while (tt -- )
	{
		for (int i = 0; i < n; i ++ ) cin >> g[i];
		int depth = 0;
		while (depth <= 15 && !dfs(0, depth)) depth ++ ;
		if (depth > 15) cout << -1 << "\n";
		else cout << depth << "\n";
	}
	return 0;
}
2023/1/2 10:23
加载中...