AcWing 108. 奇数码问题
原题链接
中等
作者:
vanBo
,
2024-06-10 13:34:48
,
所有人可见
,
阅读 11
$Wrong\ Answer$
- 想通过类似 八数码的方式解决,但是二维矩阵经过压缩成 $string$ 一维字符串后,由于八数码问题的数据为一位数据,可以很好的转化为字符,但是奇数码问题的数据范围较大,$string$并不适用
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <queue>
using namespace std;
int n;
string st, ed;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
bool bfs(string st, string ed)
{
queue<string> q;
unordered_map<string, int> d;
q.push(st);
d[st] = 0;
while (q.size())
{
string t = q.front();
q.pop();
int dist = d[t];
int pos = t.find('0');
int x = pos / n, y = pos % n;
if (t == ed) return true;
for (int i = 0; i < 4; i ++)
{
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && a < n && b >= 0 && b < n)
{
swap(t[pos], t[a * n + b]);
if (!d.count(t))
{
d[t] = dist + 1;
q.push(t);
}
swap(t[pos], t[a * n + b]);
}
}
}
return false;
}
int main()
{
while (scanf("%d", &n) != -1)
{
st.clear();
ed.clear();
for (int i = 0; i < n; i ++)
for (int j = 0; j < n; j ++)
{
char x;
cin >> x;
st += x;
}
for (int i = 0; i < n; i ++)
for (int j = 0; j < n; j ++)
{
char x;
cin >> x;
ed += x;
}
if (bfs(st, ed)) puts("TAK");
else puts("NIE");
}
return 0;
}