本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2023-12-11 21:41:59
思路:
考虑每次枚举交换哪一行或那一列,然后用 vector 来模拟,拿 map 来去重即可。
Code:
#include <bits\/stdc++.h>
using namespace std;
int n, m;
vector<vector<int>> a, b;
map<vector<vector<int>>, int> ma;
void bfs() {
queue<pair<vector<vector<int>>, int>> q;
q.push({a, 0});
while (q.size()) {
auto t = q.front().first;
auto d = q.front().second;
q.pop();
if (t == b) {
printf("%d\n", d);
exit(0);
}
for (int i = 0; i < n - 1; ++i) {
swap(t[i], t[i + 1]);
if (!ma.count(t)) {
ma[t] = 1;
q.push({t, d + 1});
}
swap(t[i], t[i + 1]);
}
for (int i = 0; i < m - 1; ++i) {
for (int j = 0; j < n; ++j) {
swap(t[j][i], t[j][i + 1]);
}
if (!ma.count(t)) {
ma[t] = 1;
q.push({t, d + 1});
}
for (int j = 0; j < n; ++j) {
swap(t[j][i], t[j][i + 1]);
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
a.resize(n);
for (int i = 0; i < n; ++i) {
a[i].resize(m);
for (int j = 0; j < m; ++j) scanf("%d", &a[i][j]);
}
b.resize(n);
for (int i = 0; i < n; ++i) {
b[i].resize(m);
for (int j = 0; j < m; ++j) scanf("%d", &b[i][j]);
}
bfs();
puts("-1");
return 0;
}

鲁ICP备2025150228号