BFS基本都是以队列来实现的,一层一层的搜索,从最先入队的位置开始搜索,入队后把改点抛弃
模板题:
首先第一思想就是搜索,显而易见为bfs
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e5+1;
string str1,str2;
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 = str1; now.step = 0;
now.x = sx; mp[str1] = 1;
q.push(now);
while (!q.empty()){
now = q.front();
q.pop();
for(int i = 0 ; i < 6; i++){
string s = now.sn;
int xx = now.x + dx[i];
if(xx >= 0 && xx < str1.size()){
swap(s[now.x],s[xx]);
if(mp[s])continue; //说明此处已搜过,就跳过
mp[s] = 1;
t.x = xx;t.step = now.step + 1;
t.sn = s;
if(t.sn == str2){
ans = t.step;
return;
}
q.push(t);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin >> str1 >> str2;
for(int i = 0 ; i < str1.size(); i++){
if(str1[i] == '*'){
sx = i;
break;
}
}
bfs();
cout << ans << endl;
return 0;
}