//其实最主要的还是定义状态与存储状态以及状态与状态之间的转换
暂时不用自己整哈希表,直接用unorded_map
广搜的核心在于用一个队列来存储每一层次的各个状态
关键点就是在于/3 和%3这两个操作 因为这两个操作间接定义了3行3列的状态
这里为什么/3和%3可以定义成三行三列呢?(这个点感觉似乎理解又似乎并没有理解的亚子)
然后继续思考,顺着代码思考,他这里还加了一个判断 对于上下左右需要x,y均满足>=0且<3;这就无疑加上了条件约束
使其满足上下左右寻值的模拟。这点是关键
操作完之后把新状态存入队列之中,然后逐个读取 直到最终状态出现 这时返回distance
最后还别忘了有个状态还原的swap
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<queue>
using namespace std;
int bfs(string state){
queue<string > q ;unordered_map<string,int> d;
q.push(state);d[state]=0;
int dx[4] = {-1,0,1,0},dy[4]={0,1,0,-1};
string end ="12345678x";
while(q.size()){
auto t = q.front();
q.pop();
if(t==end)return d[t];
int distance = d[t];
int k = t.find('x');
int x = k/3,y=k%3;
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[a*3+b],t[k]);
if(!d.count(t)){
d[t]=distance+1;
q.push(t);
}
swap(t[a*3+b],t[k]);
}
}
}
return -1;
}
int main(){
char s[2];
string state;
for(int i =0;i<9;i++){
cin>>s;
state+= *s;
}
cout<<bfs(state)<<endl;return 0;
}