AT_abc332_d

· · 题解

思路:

考虑每次枚举交换哪一行或那一列,然后用 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;
}