tyy 上课开小差,在本子上画了一个 n 行 n 列的矩阵。他把第一行 ~ 第 i 行 与 第 (n - i + 1) 行 ~ 第 n 行的所有元素交换位置。 他就得这样玩还不过瘾,想在对角上这么做,可是他能力有限请你帮助他完成这个任务。 你将获得一个 n 行 n 列的矩阵,并给你一个整数 k,当 k = 0 时为从左上到右下的主对角线,k = 1 时该对角线向右上平移一个单位长度,即向右上平移 k 个单位长度。 需要你将左上部分与右下部分对应的元素交换位置。 输入格式 输入两个整数 n (1 <= n <= 100) 和 k ( 0 <= k < n ) 接下来 n 行 n 列输入矩阵(0 <= 矩阵元素 <= 100) 输出格式 输出处理后的矩阵。 输入样例 复制 4 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出样例 复制 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16
时间: 2023-12-29 12:06:34 浏览: 123
题目描述
tyy 上课开小差,在本子上画了一个 n 行 n 列的矩阵。他把第一行 ~ 第 i 行 与 第 (n - i + 1) 行 ~ 第 n 行的所有元素交换位置。 他就得这样玩还不过瘾,想在对角上这么做,可是他能力有限请你帮助他完成这个任务。你将获得一个 n 行 n 列的矩阵,并给你一个整数 k,当 k = 0 时为从左上到右下的主对角线,k = 1 时该对角线向右上平移一个单位长度,即向右上平移 k 个单位长度。需要你将左上部分与右下部分对应的元素交换位置。
输入格式
输入两个整数 n (1 <= n <= 100) 和 k ( 0 <= k < n )
接下来 n 行 n 列输入矩阵(0 <= 矩阵元素 <= 100)
输出格式
输出处理后的矩阵。
输入样例
4 1
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出样例
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
算法1
(模拟) $O(n^2)$
这道题的做法非常简单,就是通过交换元素的位置实现矩阵的变换。
首先,我们需要对于两个元素的位置,需要确定它们在对称轴上的对称元素的位置,然后交换它们的值即可。
对于 k = 0 的情况,对称轴上的对称元素的行号与列号相等,对于 k = 1 的情况,则需要令对称元素的列号加上 k。
这里需要注意的是,当我们交换元素时,需要保证我们交换的元素不重复。
因此,我们只需要交换左上角区域中第 i 行与第 j 行的元素,右下角区域中第 n - i + 1 行与第 n - j + 1 行的元素即可。
注意到对于 k = 0 的情况,对称轴上的元素不需要交换,因此我们只需要考虑 i < j 的情况。
时间复杂度
时间复杂度为 $O(n^2)$。
C++ 代码
算法2
(模拟) $O(n^2)$
这里提供一种更为简单的做法,我们可以直接将左上角区域和右下角区域的元素交换位置即可。
对于 k = 1 的情况,我们需要将左上角区域中第 i 行与第 j + k 行的元素交换,右下角区域中第 n - j - k + 1 行与第 n - i + 1 行的元素交换。
时间复杂度
时间复杂度为 $O(n^2)$。
C++ 代码
阅读全文