https://www.acwing.com/problem/content/847/
#include<bits/stdc++.h> using namespace std; int bfs(string start) { string end="12345678x"; queue<string>q; unordered_map<string,int>d; //距离数组 q.push(start); // 先把start放进去 d[start]=0; //起点到起点的距离为0 int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; while(q.size()) { auto t=q.front(); q.pop(); int distance =d[t]; if(t==end) return distance; //判断t是否为终点 如果是 就结束 //状态转移 int k=t.find(‘x‘); //先找到x的位置 返回x的下标 int x=k/3,y=k%3; // 把一维数组下标转换为二维数组下标 3x3矩阵 for(int i=0;i<4;i++) { int a=x+dx[i],b=y+dy[i]; //变化之后的坐标 if(a>=0&&a<3&&b>=0&&b<3) //如果没有出界 { swap(t[k],t[a*3+b]); //交换 状态更新 更新完之后 一定要恢复状态 if(!d.count(t)) //如果当前更新完之后的t没有被搜到过 那就找到了一个新的状态 { d[t]=distance +1; //距离加1 q.push(t); //压入队列 } swap(t[k],t[a*3+b]); //恢复状态 } } } return -1; } int main(){ string start; //初始给定的字符串 for(int i=0;i<9;i++){ char c; cin>>c; start+=c; } cout<<bfs(start)<<endl; }