IDA* 求助
查看原帖
IDA* 求助
685604
Neovim楼主2023/1/2 00:01

这份代码及其奇怪,不知道为什么样例一跑出来是 8,然后如果输出 depth - 1 能得 90 分,还是很不理解为什么 depth 总是会大 1?

楼主可能去睡觉了,明早再来看。

#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])
				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"; // 这个 depth 总是会大 1,枚举到 7 偏偏跑不出结果,8 才出结果
	}
	return 0;
}
2023/1/2 00:01
加载中...