思路:这道题就用bfs去搜索就行,要注意的就是用一个map<string,int>mp去记录每种情况,进而达到去重的目的。
#include <bits/stdc++.h>
using namespace std;
string s1,s2;
int ans,sx;
int dx[6] = {1,2,3,-1,-2,-3};
map<string, int>mp; //判断该序列是否出现过,避免重复搜索
struct node{
int x,step; //记录当前位置,和步数
string sn;
};
node now,t;
void bfs(){
queue<node>q;
now.sn = s1; now.step=0;
now.x = sx; mp[s1]=1;
q.push(now);
while(!q.empty()){
now = q.front();
q.pop();
for(int i=0;i<6;i++){ //6个跳法去搜
string s = now.sn;
int xx= now.x+dx[i];
if(xx>=0&&xx<s1.length()){
swap(s[now.x],s[xx]);
if(mp[s]==1){continue;} //这种情况搜过,就跳过
mp[s] = 1;
t.x = xx ; t.step = now.step+1;
t.sn = s;
if(t.sn == s2){ //如果相等就返回步数
ans = t.step;
return ;
}
q.push(t);
}
}
}
}
int main(){
cin>>s1>>s2;
for(int i=0;i<s1.length();i++){
if(s1[i]=='*'){
sx = i; break;
}
}
bfs();
cout<<ans<<endl;
return 0;
}