📜  门| GATE CS 2019 |第 46 题(1)

📅  最后修改于: 2023-12-03 15:12:37.019000             🧑  作者: Mango

GATE CS 2019 |第 46 题

问题描述

给定一个$N*N$的矩阵,表示计算机中的屏幕。该屏幕上的每个像素都由二进制表示。该屏幕上的某个区域可以通过给定的四个参数来描述。参数分别是左上角坐标$(x1,y1)$和右下角坐标$(x2,y2)$。
编写一个函数来提取给定区域上的像素,并将其向右旋转90度。

def rotate(matrix):
    """
    :type matrix: List[List[int]]
    :rtype: void Do not return anything, modify matrix in-place instead.
    """
示例

例如,给定矩阵为:

[
  [1,2,3],
  [4,5,6],
  [7,8,9]
]

将矩次的上下角标进行改变后,矩形区域为$[(0, 0), (1, 2)]$,旋转后得到的结果为:

[
  [3,6],
  [2,5],
  [1,4]
]
解题思路

首先,根据给定的四个参数提取给定区域的像素值。然后将取出的像素值按照题目要求进行旋转。 旋转规则是将矩阵逆时针旋转$90$度。
通过观察旋转后的矩阵,可以发现,矩阵的每个元素在旋转后找到的位置都可以表示为$(col,newrow)$。其中,$col$表示元素在旋转前所在列数,$newrow$表示元素在旋转后所在的行数。
在矩阵中,每个元素的新位置可能会出现重叠,因此我们需要一个额外的数组表示是否已经访问过该位置。在访问完所有元素后,我们只需要将原矩阵按顺序修改为旋转后的矩阵即可。

代码实现
def rotate(matrix):
    """
    :type matrix: List[List[int]]
    :rtype: void Do not return anything, modify matrix in-place instead.
    """
    x1, y1, x2, y2 = (0, 0, 2, 1)  # 例题中的矩形区域
    m, n = len(matrix), len(matrix[0])
    if x1 >= m or y1 >= n:
        return

    visited = [[False]*n for _ in range(m)]

    for row in range(x1, x2+1):
        for col in range(y1, y2+1):
            visited[row][col] = True
            newrow, newcol = col, n-row-1  # 按照规律计算新的行和列
            while not visited[newrow][newcol]:
                matrix[row][col], matrix[newrow][newcol] = matrix[newrow][newcol], matrix[row][col]
                visited[newrow][newcol] = True
                row, col = newrow, newcol
                newrow, newcol = col, n-row-1