题目链接:https://www.lanqiao.cn/problems/261/learning/
解题思路:将初始状态和需要到的状态保存,将初始状态入队列,开始BFS,把每次bfs后的状态判断下,然后把到这个状态需要的步数存在map里,然后输出map【需要的状态】。
#include <bits/stdc++.h>
using namespace std;
int fx[4][4]={{1,0},{0,1},{-1,0},{0,-1}};//四个方向
map<string,int >m;
int x,y;
char a[5][5];
queue<string>q;
void fun(string p){
a[1][1]=p[0];
a[1][2]=p[1];
a[1][3]=p[2];
a[2][1]=p[3];
a[2][2]=p[4];//懒的写循环了
a[2][3]=p[5];
a[3][1]=p[6];
a[3][2]=p[7];
a[3][3]=p[8];
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
if(a[i][j]=='.'){//找到. 只能从点上下左右移
x=i;
y=j;
break;
}
}
}
}
int main()
{
string str;
string str1;
cin>>str>>str1;
q.push(str1);
m[str1]=0;
while(q.size()){
string st=q.front();//拿出队头,从初始状态开始
//cout<<st<<" ";
if(st==str){
cout<<m[st];//等于需要到的状态,退出
return 0;
}
q.pop();
fun(st);//转成二维数组
for(int i=0;i<4;i++){
int j,k;
j=x+fx[i][0];
k=y+fx[i][1];
if(j<1||k<1||j>3||k>3) continue;
a[x][y]=a[j][k];//与上下左右交换
a[j][k]='.';
string bh="";
for(int w=1;w<=3;w++){
for(int r=1;r<=3;r++){
bh+=a[w][r];//转成字符串入队列
}
}
//cout<<bh<<endl;;
if(m[bh]==0){
q.push(bh);//说明bh这种状态没到过
}
a[j][k]=a[x][y];
a[x][y]='.';
m[bh]=m[st]+1;//换回来,让下次继续交换
}
}
//cout<<m[str];
return 0;
}