map,unordered_map Q;
Q.find(xx) 返回的是迭代器,不是位置
Q.count(x) 查找的是key是否存在,存在返回1,不存在返回0;
string a;
a.find(“xxx”)查找子字符串,存在的话,返回子字符串第一个位置,不存在返回乱码
a.find(‘x’) 查找字符 存在的话返回其位置 , 查找不到返回乱码
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <unordered_map>
#include <queue>
using namespace std;
int bfs(string start)
{
string end = "12345678x";//遍历队列出现"12345678x"停止
int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
unordered_map<string, int> d;// 记录每个状态的变换次数
queue<string> q; //存出现的状态
q.push(start);
d[start] = 0;
while(!q.empty())
{
auto t = q.front();
q.pop();
//当状态转换到end时,bfs的距离“同步”更新使得此时得到的就是最短路径。
//至于中间枚举的多余的试探路线不用去在意,对结果不会有影响
if(t == end)
return d[t];
int dis = d[t];
int k = t.find('x');//找到x在字符串里面的位置
int x = k / 3, y = k % 3;//坐标变换,变换到二维字符组里面的位置
for(int i = 0; i < 4; i++)
{
int xx = x + dx[i], yy = y + dy[i];//遍历该点的上下左右
if(xx >= 0 && xx < 3 && yy >= 0 && yy < 3)
{
swap(t[xx*3+yy], t[k]);//交换x与上下左右某一方向的位置
if(!d.count(t))//如果交换后的字符串没出现过
{
d[t] = dis + 1;//更新其距离
q.push(t);//并将这个字符串(状态)入队
}
swap(t[xx*3+yy], t[k]);//状态还原是为了对同一个位置的x 进行拓展操作
}
}
}
return -1;
}
int main()
{
string start;
for(int i = 0; i < 9; i++)
{
char c;
cin >> c;
start += c;
}
cout << bfs(start);
return 0;
}