#6812. 矩阵变幻

矩阵变幻

题目背景

小蓝学习了二维数组的基础操作后,设计了一套有趣的矩阵变换流程。他发现通过这些简单的步骤,可以将一个矩阵变得“面目全非”。现在请你帮他模拟这个过程。

题目描述

给定一个 nnmm 列的整数矩阵 AA,依次执行以下全部操作:

  1. 转置:将矩阵 AA 转置,得到大小为 m×nm \times n 的新矩阵 BB
  2. 垂直翻转:将 BB 上下翻转(即第一行与最后一行交换,第二行与倒数第二行交换,以此类推)。
  3. 行滚动:对于上一步得到的矩阵,将它的第 ii 行(ii11 开始)的所有元素循环左移 (i1)(i-1) 个位置。
    例如第 11 行循环左移 00 位,保持不变;第 22 行循环左移 11 位;第 33 行循环左移 22 位……如果左移位数超过该行的长度,则对行长度取模后再移动。
  4. 蛇形重排:将上一步得到的矩阵按照蛇形遍历的顺序取出一维序列:第一行从左到右,第二行从右到左,第三行从左到右,第四行从右到左……以此类推。
    然后将这个序列按照列优先的顺序依次填入一个 rrcc 列的矩阵 CC(先填满第 11 列从上到下,再填第 22 列……)。题目保证 r×cr \times c 恰好等于当前矩阵的元素总数(即 m×nm \times n)。
  5. 边界求和:计算最终矩阵 CC边界元素和。边界元素指位于第 11 行、第 rr 行、第 11 列、第 cc 列的所有元素。如果一个元素同时属于行边界和列边界(即四个角上的元素),只计算一次。

现在给定 n,m,r,cn, m, r, c 以及矩阵 AA,请你输出最终的矩阵 CC 和它的边界元素和。

输入格式

第一行包含四个整数 n,m,r,cn, m, r, c,分别表示原始矩阵的行数、列数,以及最终矩阵的行数、列数。

接下来 nn 行,每行 mm 个整数,表示矩阵 AA 的元素。同一行的整数之间用空格分隔。

输出格式

首先输出 rr 行,每行 cc 个整数,表示最终矩阵 CC,同一行的整数之间用一个空格隔开。

最后输出一行一个整数,表示矩阵 CC 的边界元素之和。

样例 #1

样例输入 #1

2 3 2 3
1 2 3
4 5 6

样例输出 #1

3 2 1
6 5 4
21

提示

【样例解释】

原始矩阵 AA2×32 \times 3):

1 2 3
4 5 6
  1. 转置得到 3×23 \times 2 矩阵:
1 4
2 5
3 6
  1. 垂直翻转后:
3 6
2 5
1 4
  1. 行滚动:第 11 行左移 00 位:3 6;第 22 行左移 11 位:5 2;第 33 行左移 22 位(对长度 22 取模后等于左移 00 位):1 4。得到矩阵:
3 6
5 2
1 4
  1. 蛇形遍历:第 11 行从左到右得 3, 6;第 22 行从右到左得 2, 5;第 33 行从左到右得 1, 4。序列为 [3, 6, 2, 5, 1, 4]
    按列优先填入 2×32 \times 3 矩阵:第 113, 6;第 222, 5;第 331, 4。得到 CC
3 2 1
6 5 4
  1. 边界元素:该矩阵一共 2233 列,所有元素都在边界上,和为 3+2+1+6+5+4=213+2+1+6+5+4 = 21

【数据范围】

对于 100%100\% 的数据,1n,m,r,c1001 \le n, m, r, c \le 100,且 r×c=m×nr \times c = m \times n
矩阵中的元素均为整数,绝对值不超过 10410^4