蓝桥打卡-6-九宫重拍(八数码)
作者:
因为yxc爱上编程
,
2024-04-07 10:46:24
,
所有人可见
,
阅读 24
#include <iostream>
#include<algorithm>
#include<unordered_map>
#include<queue>
using namespace std;
unordered_map<string,int>d;
queue<string>q;
int bfs(string start,string end){
q.push(start);
d[start]=0;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
while(q.size()){
auto t=q.front();
//取一个就要pop掉
q.pop();
int distance=d[t];
if(t==end)
return distance;//如果此刻是终态,就返回数值
int idx=t.find('.');//找出点的下标,将一维转变为二维,上下左右移动
int a=idx/3;
int b=idx%3; //a,b不能变,因为每次判断邻接点都要用到原来的值
for(int i=0;i<4;i++){
int ax=a+dx[i];
int bx=b+dy[i];
if(0<=ax&&ax<3&&0<=bx&&bx<3){
//这个点可以走,然后在判断一下之前走过没有,之前走过d里面有映射,那里面放的
//肯定是最短的
swap(t[idx],t[ax*3+bx]);//交换t中两个字符的位置,此时t这个图整体就变了
if(!d.count(t))//看map映射里面求没有求过这个字符串,如果有,就直接pass
{
d[t]=distance+1;
q.push(t);
}
swap(t[idx],t[ax*3+bx]);//求相邻点是在原来的基础上,因为把图变了,到这里要变回来
}
}
}
return -1;
}
int main()
{
string start;
string end;
cin>>start>>end;
cout<<bfs(start,end)<<endl;
return 0;
}
这些题在哪里弄的呀
蓝桥官网就有