传送门
1. 朴素 bfs ,map 判重,实现最简单
#include <iostream>
#include <cstdio>
#include <unordered_map>
#include <algorithm>
#include <queue>
#define int long long
using namespace std;
queue<int> q;
unordered_map<int,int> mp;
const int goal=123804765;
const int dx[]={-1,0,0,1};
const int dy[]={0,-1,1,0};
int n;
void bfs(){
q.push(n);mp[n]=0;
while(!q.empty()){
int u=q.front();q.pop();
int c[3][3],f=0,g=0,n=u;
if(u==goal)break;
for(int i=2;i>=0;i--)
for(int j=2;j>=0;j--){
c[i][j]=n%10;
n/=10;
if(!c[i][j])f=i,g=j;//空白结点
}
for(int i=0;i<4;i++){
int xx=f+dx[i],yy=g+dy[i],ss=0;
if(xx<0||yy<0||xx>2||yy>2)continue;
swap(c[xx][yy],c[f][g]);
for(int i=0;i<3;i++)
for(int j=0;j<3;j++){
ss=ss*10+c[i][j];
}
if(!mp.count(ss)){
q.push(ss);
mp[ss]=mp[u]+1;
}
swap(c[xx][yy],c[f][g]);
}
}
cout<<mp[goal]<<endl;
exit(0);
}
signed main(){
scanf("%d",&n);
bfs();
return 0;
}
2. IDA*
#include <iostream>
#include <cstdio>
#include <unordered_map>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
int deep;
string st,ed;
const int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
int h(string st){//评估函数
int ans=0;
for(int i=0;i<st.size();i++){
if(st[i]=='0')continue;
int j=ed.find(st[i]),r=i/3,c=i%3;
int x=j/3,y=j%3;
ans+=abs(r-x)+(c-y);
}
}
bool dfs(int now,int pre){
int H=h(st);
if(!H)return true;
if(now+cnt>deep)return false;
......
}