题目链接:点击这里
状态图怎么存?字符串
状态怎么判重?基于哈希的unordered_map存储最短距离,还可判重。
状态之间怎么转移?首先找到一维字符串中‘x’的位置,然后除3模3即可得到其在二维矩阵中的坐标,将其与上下左右的字符进行交换即可。
#include <iostream>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
int bfs(string start)
{
queue<string> q;
unordered_map<string, int> d;
string end = "12345678x";
q.push(start);
d[start] = 0;
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; // (x,y)是'x'在二维里的坐标
for (int i = 0; i < 4; i ++ )
{
int a = x + dx[i], b = y + dy[i]; // (a,b)是(x,y)上下左右的某一点
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()
{
string start;
for (int i = 0; i < 9; i ++ )
{
char c;
cin >> c;
start += c;
}
cout << bfs(start) << endl;
return 0;
}