题目:
Seven Puzzle - Aizu 0121 - Virtual Judge
分析:
使用BFS预处理,将所有状态预处理出来,然后逐个查找。
(我一开始直接搜的,超时)
使用知识:BFS,队列,哈希表。
代码:
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;
unordered_map<string, int> d;
void bfs(string start)
{
//cout << start << endl;
queue<string> q;
q.push(start);
d[start] = 0;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
while (q.size())
{
auto t = q.front(); q.pop();
int distance = d[t];
int k = t.find('0');
int x = k / 4, y = k % 4;
for (int i = 0; i < 4; i ++ )
{
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && a < 2 && b >= 0 && b < 4)
{
swap(t[k], t[a * 4 + b]);
if (!d.count(t))
{
d[t] = distance + 1;
q.push(t);
}
swap(t[k], t[a * 4 + b]);
}
}
}
}
int main()
{
bfs("01234567");
string start;
while (getline(cin, start))
{
start.erase(remove(start.begin(), start.end(), ' '), start.end());
cout << d[start] << endl;
}
return 0;
}