就一个点过不去
#include<stdio.h>
#include<math.h>
#include<memory.h>
char temp[4][4];
int mp[3][3],ans,maxdep=0,find=0,stx,sty;
int spx[4]={1,0,-1,0},spy[4]={0,-1,0,1};
int res[3][3]={
{1,2,3},
{8,0,4},
{7,6,5}
};
int abs(int a){return(a<0)?a*-1:a;}
int compress(){
int res = 0;
for (int i = 0 ; i < 3 ; i ++ ){
for (int j = 0; j < 3 ; j ++ ){
res += mp[i][j] * pow(2,i*3+j);
}
}
return res;
}
int check(){
for (int i = 0 ; i < 3 ; i ++ ){
for (int j = 0 ; j < 3 ; j ++ ){
if ( mp[i][j] != res[i][j] ) return 0;
}
}
return 1;
}
int ch(){
int rt = 0;
for (int i = 0 ; i < 3 ; i ++ ){
for (int j = 0 ; j < 3 ; j ++ ){
for (int x = 0 ; x < 3 ; x ++ ){
for (int y = 0 ; y < 3 ; y ++ ){
if ( res[x][y] == mp[i][j] && mp[i][j] != 0) {
rt += abs(x-i)+abs(y-j);
}
}
}
}
}
return rt;
}
void print(){
for (int k = 0 ; k < 3 ; k ++ ){
for (int j = 0 ; j < 3 ; j ++ ){
printf("%d ",mp[k][j]);
}
puts("");
}
}
void IDA_star(int x,int y,int dep,int maxdep){
if ( dep == maxdep && check() ) {
find = 1;
ans = maxdep;
return;
}
int b = ch();
if ( find == 1 )return;
if ( dep + ch() > maxdep ) return;
for (int i = 0 ; i < 4 ; i ++ ){
int nx = x + spx[i] , ny = y + spy[i];
if ( nx < 0 || nx >= 3 || ny < 0 || ny >= 3 ) continue;
int t = mp[nx][ny];
mp[nx][ny] = mp[x][y];
mp[x][y] = t;
IDA_star(nx,ny,dep+1,maxdep);
t = mp[nx][ny];
mp[nx][ny] = mp[x][y];
mp[x][y] = t;
}
}
int main(){
for (int i = 0 ; i < 9 ; i ++ ) scanf("%c",&temp[i/3][i%3]);
for (int i = 0 ; i < 3 ; i ++ ){
for (int j = 0 ; j < 3 ; j ++ ){
mp[i][j] = temp[i][j] - '0';
if (mp[i][j] == 0){
stx = i;
sty = j;
}
}
}
if ( check() ){
printf("%d",0);
return 0;
}
while (1){
maxdep ++;
IDA_star(stx,sty,0,maxdep);
if ( find == 1 ){
printf("%d",ans);
break;
}
}
return 0;
}