这份代码及其奇怪,不知道为什么样例一跑出来是 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;
}