点击查看代码
#include<bits/stdc++.h>
using namespace std;
string start_s;
string goal="123804765";
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
void bfs()
{
if(start_s==goal){
cout<<"0"<<endl;
return;
}
map<string,int> d1,d2;
queue<string> q1,q2;
q1.push(start_s);
q2.push(goal);
d1[start_s]=0;
d2[goal]=0;
while(!q1.empty()&&!q2.empty()){
if(q1.size()>q2.size()){
swap(q1,q2);
swap(d1,d2);
}
string curr = q1.front();
q1.pop();
int pos=curr.find('0');
int x=pos/3;
int y=pos%3;
int dist=d1[curr];
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<=2&&ny>=0&&ny<=2){
string next_s;
next_s=curr;
swap(next_s[pos],next_s[3*nx+ny]);
if(d2.count(next_s)){
cout<<dist+1+d2[next_s]<<endl;
return;
}
if(d1.find(next_s)==d1.end()){
q1.push(next_s);
d1[next_s]=dist+1;
}
}
}
}
}
int main()
{
cin>>start_s;
bfs();
return 0;
}