Skip to content

04075: 矩阵旋转

http://cs101.openjudge.cn/practice/04075/

给定一个n*n的矩阵,求出该矩阵顺时针旋转90度后的矩阵。

输入

第一行为矩阵的数量M(1<=M<=100),其后每个矩阵数据的第一行是该矩阵的行数(行数=列数)n(1<=n<=100),后面跟着n行数据,每行是矩阵在该行的列数据,数字间由空格隔开。

输出

输出N个矩阵,每个矩阵由若干行构成,每行代表矩阵当前行的列数据,数字间由空格隔开,每行最后一个数字后面不输出空格。

样例输入

1
2
1 2
3 4

样例输出

3 1
4 2

对于一个 n x n 矩阵,逆时针旋转90度后的坐标变换规则如下:

  • 原来的行号 i 变为新列的位置。
  • 原来的列号 j 变为 n - 新行的位置 - 1。

具体来说,如果我们将矩阵逆时针旋转90度,则原坐标 (i, j) 的元素会移动到新坐标 (n - j - 1, i)。这里 n - j - 1 是因为数组索引是从0开始的,所以需要减去1来计算新的行位置。

python
def rotate_matrix_90(matrix):
    n = len(matrix)
    return [[matrix[n - j - 1][i] for j in range(n)] for i in range(n)]

def print_matrix(matrix):
    for row in matrix:
        print(' '.join(map(str, row)))

def main():
    M = int(input())
    results = []
    for _ in range(M):
        n = int(input())
        matrix = [list(map(int, input().split())) for _ in range(n)]
        rotated = rotate_matrix_90(matrix)
        results.append(rotated)
    
    for result in results:
        print_matrix(result)

if __name__ == "__main__":
    main()

顺时针90度旋转,坐标变换的规则会有所不同。具体来说,原矩阵中的元素位置 (i, j) 在顺时针旋转90度后,将移动到新的位置 (j, n - i - 1)。这里,原来的行号 i 变成了新列的位置,而原来的列号 j 则变成了 n - 新行的位置 - 1(因为数组索引从0开始)。

应用顺时针旋转90度的转换公式 [[matrix[j][n - i - 1] for j in range(n)] for i in range(n)]