估价函数如果不判断那个 * 跑出来的答案将会是 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;
}