//有点被自己无语到,debug过程不小心把函数调用给删了,到后面死活不出输出结果
//又因为这个找了好久的bug…呜呜呜
//创新点:不能找到终值状态,因为只有A,B位置互换就可,其他点位置不管,所以终态有许多个,在这里看是否满足条件,就是去看A,B,位置是否互换即可
//getline函数可以读入空格,遇到换行符停止,此题需要用getline函数
#include <iostream>
#include<string>
#include <queue>
#include<unordered_map>
using namespace std;
string start;
int a,b;
queue<string>q;
unordered_map<string,int>d;//每种状态和要走的步数映射
void dfs(){
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
q.push(start);
d[start]=0;
while(q.size()){
auto t=q.front();//*************
q.pop();
int distance=d[t];
if(t.find('A')==b&&t.find('B')==a)//&&&&&&&&&&&&&&&&本题的巧妙之处
{ cout<<d[t]<<endl;
return;
}
int idx=t.find(' ');
int x=idx/3;
int y=idx%3;//将一维坐标转换为二维
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<=1&&ny>=0&&ny<=2)
//&&&&&&&&&&&&&&&易错点,行列值不一样!!!
//坐标范围为0-5,则x范围为0-1,y范围为0-2
{
swap(t[idx],t[nx*3+ny]);
//判断一下之前求过没有
if(!d.count(t))
{
d[t]=distance+1;
q.push(t);
}
swap(t[idx],t[nx*3+ny]);
}
}
}
}
int main()
{
string m;
string n;
getline(cin,m);//getline函数可以读入空格,遇到换行符停止
getline(cin,n);
start=m+n;
a=start.find('A');
b=start.find('B');
//不能找到终值状态,因为只有A,B位置互换就可,其他点位置不管,所以终态有许多个
//在这里看是否满足条件,就是去看A,B,位置是否互换&&&&&&&&&&&&&
dfs();
return 0;
}