Logo FiraCode 的博客

博客

AT_abc332_d

...
FiraCode
2025-12-01 12:55:22
什么意思呢

本文章由 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;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。