Note:
就硬宽搜,每次把上下左右的四个位置遍历一边看看,因为是要找最短路,所以可以用宽搜来解决
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>
using namespace std;
int bfs(string begin)
{
queue<string> q;
unordered_map<string, int> map;
string end = "12345678x";
q.push(begin);
map[begin] = 0;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
while(q.size())
{
auto s = q.front();
q.pop();
if(s == end) return map[s];
int p = s.find("x");
int x = p / 3, y = p % 3;
int distance = map[s];
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) continue;
swap(s[a * 3 + b], s[p]);
if(!map.count(s))
{
map[s] = distance + 1;
q.push(s);
}
swap(s[a * 3 + b], s[p]);
}
}
return -1;
}
int main()
{
string begin;
char c[2];
for(int i = 0; i < 9; i ++){
cin >> c;
begin += *c;
}
cout << bfs(begin) << endl;
return 0;
}