最小步书模型1:1107
作者:
总打瞌睡的天天啊
,
2024-10-20 19:44:36
,
所有人可见
,
阅读 3
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;
unordered_map<string,string> from;
string mA(string now){ //第一种代替操作
reverse(now.begin(),now.end());
return now;
}
string mB(string now){ //第二种代替操作
for(int i=3;i>0;i--){
swap(now[i],now[i-1]);
swap(now[7-i],now[8-i]);
}
return now;
}
string mC(string now){ //第三种代替操作
swap(now[1],now[2]);
swap(now[1],now[5]);
swap(now[1],now[6]);
return now;
}
void bfs(string begin,string end){ //广度优先搜索
queue<string> que;
que.push(begin);
from[begin]=""; //初始为空
while(que.size()){
string now=que.front(); //取出队头
que.pop();
string m[3]={mA(now),mB(now),mC(now)}; //储存三种操作得到的结果
for(int i=0;i<3;i++)
if(!from.count(m[i])){ //此操作得到的字符串没被遍历过
from[m[i]]=from[now]+char('A'+i); //储存来源
if(m[i]==end)
return;
que.push(m[i]); //插入队列
}
}
}
int main(){
string begin="12345678",end;
for(int i=0;i<8;i++){
int x;
scanf("%d",&x);
end+=char(x+'0');
}
if(begin!=end)
bfs(begin,end);
cout<<from[end].size()<<endl<<from[end];
return 0;
}
//STL神力
//跟之前走路不一样,这一次把走路换为了对字符串进行操作
//但其原理是类似的