BFS解决八数码问题
八数码问题
原题链接:https://www.acwing.com/problem/content/847/
-
数据的表示和存储
- 首先是八数码的存储方式:此题选择用字符串来存,每一个状态使用一个字符串来存储
- 使用队列queue
来存储各种状态 - 记录每个状态和初始状态的距离:unordered_map<string,int>来存储
-
bfs函数
- 初始状态进入队列
- while(q.size())
- 弹出队列首元素
- 如果首元素就是答案,则返回其对应到初始状态的距离
- 在该字符串找到'x'
- 字符串中的下标转换为图中的坐标
- 上下左右四个方向循环
- 如果上下左右不出界并且该状态未访问过,则加入到队列中
- 记得在下一次循环前返回到原状态!
- 如果队列空了,仍未与end相同,则返回-1
#include <bits/stdc++.h>
using namespace std;
int bfs(string start)
{
string end = "12345678x";
unordered_map<string,int> d;
queue<string> q;
q.push(start);
d[start] = 0;
int xx[4] = {-1,0,1,0};
int yy[4] = {0,1,0,-1};
while(q.size())
{
string t = q.front();
q.pop();
if(t == end)
return d[t];
int k = t.find('x');
int x = k / 3;
int y = k % 3;
int dis = d[t];
for(int i = 0; i < 4; i++)
{
int a = x + xx[i];
int b = y + yy[i];
if(a >= 0 && a < 3 && b >= 0 && b < 3)
{
swap(t[k],t[a*3+b]);
if(!d.count(t))
{
d[t] = dis + 1;
q.push(t);
}
swap(t[k],t[a*3+b]);
}
}
}
return -1;
}
int main()
{
string start;
char c[2];
for(int i = 0; i < 9; i++)
{
cin >> c;
start += *c;
}
cout << bfs(start) << endl;
}

浙公网安备 33010602011771号