\[ \sum_{i=1}^{3}\sum_{j=1}^{3}[g[i][j]≠des[i][j]] \]
\[ f(g[][])=\sum_{i=1}^{3}\sum_{j=1}^{3}[g[i][j]≠des[i][j]] \]
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 4
using namespace std;
const int des[4][4]={{},{0,1,2,3},{0,8,0,4},{0,7,6,5}};
const int dir[4][2]={{-1,0},{0,-1},{0,1},{1,0}};
int g[maxn][maxn],ans;
inline int Abs(const int &x){ return x<0?-x:x; }
inline int evaluate(){
int cnt=0;
for(register int i=1;i<=3;i++) for(register int j=1;j<=3;j++) if(g[i][j]!=des[i][j]) cnt++;
return cnt;
}
inline bool check(const int &x,const int &y){ return x<1||3<x||y<1||3<y; }
void IDAstar(int x,int y,int dep,int pre_dir,const int &maxdep){
if(dep==maxdep){ if(!evaluate()) ans=true; return; }
for(register int i=0;i<4;i++) if(i+pre_dir!=3){
int tx=x+dir[i][0],ty=y+dir[i][1];
if(!check(tx,ty)){
swap(g[x][y],g[tx][ty]);
if(dep+evaluate()<=maxdep) IDAstar(tx,ty,dep+1,i,maxdep);
swap(g[x][y],g[tx][ty]);
if(ans) return;
}
}
}
int main(){
int sx,sy;
for(register int i=1;i<=3;i++){
for(register int j=1;j<=3;j++){
scanf("%1d",&g[i][j]);
if(!g[i][j]) sx=i,sy=j;
}
}
if(!evaluate()){ puts("0"); goto Lzs; }
for(register int maxdep=1;;maxdep++){
IDAstar(sx,sy,0,-1,maxdep);
if(ans){ printf("%d\n",maxdep); break; }
}
Lzs:;
return 0;
}
原文:https://www.cnblogs.com/akura/p/10877907.html