AcWing 845. 八数码
原题链接
中等
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<queue>
using namespace std;
int bfs(string start)
{
string end="12345678x"; //定义目标状态
//定义队列和dist数组
queue<string> q;
unordered_map<string ,int>d;
//初始化队列和dist数组
q.push(start);
d[start]=0;
//转移方式
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
while(q.size())
{
auto t=q.front();
q.pop();
int distance=d[t]; //记录当前状态的距离,如果是最终状态则返回距离
if(t==end) return d[t];
int k=t.find('x');
for(int i=0;i<4;i++)
{
int x=k/3+dx[i],y=k%3+dy[i];//求转移后x的坐标
if(x>=0&&x<3&&y>=0&&y<3)
{
//转移x
swap(t[k],t[3*x+y]);
if(!d.count(t))//如果当前状态是第一次遍历,记录距离,入队
{
d[t]=distance+1;
q.push(t);
}//还原状态,为下一种转换情况做准备
swap(t[k],t[3*x+y]);
}
}
}
//无法转换到目标状态,返回-1
return -1;
}
int main()
{
string start;
for(int i=0;i<9;i++)
{
char c;
cin>>c;
start+=c;
}
cout<<bfs(start)<<endl;
return 0;
}