AcWing 845. 八数码【BFS】
原题链接
中等
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<set>
using namespace std;
string start;
string dest = "12345678x";
struct state{
string s;
int step;
}tmp;
set<string> sset; // 存储每次的字符串状态
int bfs(string s)
{
state t1, t2;
queue<state> q;
tmp.step = 0;
tmp.s = s;
q.push(tmp);
while(q.size())
{
t1 = q.front();
q.pop();
if(t1.s == dest)
{
cout << t1.step;
return 0;
}
int pos = t1.s.find('x'); // 找到x的位置
// 向左走
if(pos-1 >= 0 && pos-1!=2 && pos-1!=5)
{
string str = t1.s;
swap(str[pos],str[pos-1]);
if(!sset.count(str)) // 如果这个字符串(状态)没有出现过
{
sset.insert(str);
t2.s = str;
t2.step = t1.step + 1;
q.push(t2);
}
}
// 向右走
if(pos+1 <= 8 && pos+1!=3 && pos+1!=6)
{
string str = t1.s;
swap(str[pos],str[pos+1]);
if(!sset.count(str)) // 如果这个字符串(状态)没有出现过
{
sset.insert(str);
t2.s = str;
t2.step = t1.step + 1;
q.push(t2);
}
}
// 向上走
if(pos-3 >= 0)
{
string str = t1.s;
swap(str[pos],str[pos-3]);
if(!sset.count(str)) // 如果这个字符串(状态)没有出现过
{
sset.insert(str);
t2.s = str;
t2.step = t1.step + 1;
q.push(t2);
}
}
// 向下走
if(pos+3<=8)
{
string str = t1.s;
swap(str[pos],str[pos+3]);
if(!sset.count(str)) // 如果这个字符串(状态)没有出现过
{
sset.insert(str);
t2.s = str;
t2.step = t1.step + 1;
q.push(t2);
}
}
}
return -1;
}
int main()
{
char a; // 当作字符
for(int i = 0;i < 9;i++)
{
cin >> a;
start = start + a; // 转化为字符串
}
int k = bfs(start);
if(k==-1)
{
cout << k;
}
return 0;
}