1 条题解
-
0
题意简述
给定一个 的排列矩阵 (元素为 的排列),需要构造另一个排列矩阵 ,使得每个位置上的数都与 中对应位置的数不同。若无法构造输出 。
解法
- 若 ,此时只有一个数,无论如何排列都会与原矩阵相同,输出 。
- 若 ,可以将每个数循环加 1(模 ),即 。
- 这样,所有数都会变成原来的下一个数( 变成 )。因为 ,对于任意位置,新数都不等于原数。
- 同时,新矩阵仍然是一个排列,包含了 到 的所有整数。
- 直接按原位置输出新数即可。
复杂度
- 每组测试数据需要遍历整个矩阵一次,时间复杂度 。
- 总计算量不超过 ,完全可以接受。
参考代码
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { int n, m; cin >> n >> m; int total = n * m; if (total == 1) { int x; cin >> x; cout << "-1\n"; continue; } vector<vector<int>> a(n, vector<int>(m)); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) cin >> a[i][j]; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { int val = a[i][j] % total + 1; cout << val << " \n"[j == m - 1]; } } } return 0; }
- 1
信息
- ID
- 6914
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者