这个题比较简单 直接枚举搜索深度
估价函数为当前棋盘与目标棋盘不同的棋的个数
然后直接迭代加深搜索就可以了
当然还不能走回头路
Codes
#include<bits/stdc++.h>
using namespace std;
const int N = 10;
char a[N][N], c[N][N];
int fx[8][2] = {{1, 2}, {1, -2}, {2, -1}, {2, 1}, {-2, -1}, {-2, 1}, {-1, 2}, {-1, -2}};
int n = 5, len;
int diff() {
int res = 0;
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= n; ++ j)
res += (a[i][j] != c[i][j]);
return res;
}
bool dfs(int x, int y, int d, int last) {
int res = diff();
if(!res) return true;
if(d == len) return false;
if(d + res > 16) return false;
for(int i = 0; i < 8; ++ i) {
int xx = x + fx[i][0], yy = y + fx[i][1];
if(xx < 0 || xx > n || yy < 0 || yy > n || i + last == 7) continue;
swap(a[x][y], a[xx][yy]);
if(dfs(xx, yy, d + 1, i)) return true;
swap(a[x][y], a[xx][yy]);
}
return false;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("2324.in", "r", stdin);
freopen("2324.out", "w", stdout);
#endif
int T, flag = 0, sx, sy;
c[1][1] = c[1][2] = c[1][3] = c[1][4] = c[1][5] = '1';
c[2][1] = '0'; c[2][2] = c[2][3] = c[2][4] = c[2][5] = '1';
c[3][1] = c[3][2] = '0'; c[3][3] = '*'; c[3][4] = c[3][5] = '1';
c[4][1] = c[4][2] = c[4][3] = c[4][4] = '0'; c[4][5] = '1';
c[5][1] = c[5][2] = c[5][3] = c[5][4] = c[5][5] = '0';
for(scanf("%d", &T); T -- ; flag = 0) {
for(int i = 1; i <= n; ++ i)
scanf("%s", a[i] + 1);
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= n; ++ j)
if(a[i][j] == '*')
sx = i, sy = j;
for(len = 0; len <= 15; ++ len)
if(dfs(sx, sy, 0, -1)) {
flag = 1; printf("%d\n", len); break;
}
if(!flag) puts("-1");
}
return 0;
}