思路:dfs搜索+A*的估价函数。需要注意的是终止条件需要减去1,因为*号也被统计在不同内。
Code:
#include <bits/stdc++.h>
using namespace std;
const int AX = 5+6;
char G[AX][AX];
int f ;
char target[AX][AX] = {
{'1','1','1','1','1'},
{'0','1','1','1','1'},
{'0','0','*','1','1'},
{'0','0','0','0','1'},
{'0','0','0','0','0'}
};
int dir[8][2] = {
{ 2 , 1 },
{ 2 , -1 },
{ -2 , 1 },
{ -2 ,-1 },
{ 1 , 2 },
{ 1 , -2 },
{ -1 , 2 },
{ -1 , -2 }
};
int g(){
int ans = 0 ;
for( int i = 0; i < 5 ; i++ ){
for( int j = 0; j < 5 ; j++ ){
if( target[i][j] != G[i][j] ){
ans ++ ;
}
}
}return ans ;
}
void dfs( int x , int y , int stp , int lim ){
if( f ) return ;
int g_ = g();
if( !g_ ){
f = 1 ;
return ;
}
if( g_ + stp - 1 > lim ) return ;
for( int i = 0 ; i < 8 ; i++ ){
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if( xx < 0 || xx > 4 || yy < 0 || yy > 4 ) continue;
swap( G[x][y] , G[xx][yy] );
dfs( xx , yy , stp + 1 , lim );
swap( G[x][y] , G[xx][yy] );
}
}
int main(){
int T;
scanf("%d",&T);
while( T-- ){
f = 0 ;
int idx , idy ;
for( int i = 0 ; i < 5 ; i++ ){
scanf("%s",G[i]);
for( int j = 0 ; j < 5 ; j++ ){
if( G[i][j] == '*' ){
idx = i ; idy = j ;
}
}
}
int step = 0 ;
while( step <= 15 ){
dfs( idx , idy , 0 , step );
if( f ){
break;
}
step ++ ;
}
if( f ) printf("%d\n",step);
else printf("-1\n");
}
return 0 ;
}