【问题标题】:Array in-place rotater returning wrong values数组就地旋转器返回错误值
【发布时间】:2019-03-15 10:27:00
【问题描述】:

我希望定义一个函数将矩阵原地旋转 90 度

def rotate_matrix(matrix):
        for i in range(len(matrix)//2):
            for j in range(i, len(matrix)-i-1):
                matrix[~j][i], matrix[i][j], matrix[j][~i], matrix[~i][~j] = matrix[i][j], matrix[j][~i], matrix[~i][~j], matrix[~j][i]
        return matrix

插入时:

[
 [a, b],
 [c, d]
]

它返回:

[
 [b, d],
 [a, c]
]

代替:

[
 [c, a],
 [d, b]
]

我不确定为什么。

【问题讨论】:

    标签: python algorithm array-algorithms


    【解决方案1】:

    你在正确的轨道上!您的代码执行逆时针旋转而不是顺时针
    要解决它,您必须对分配逻辑进行一些小的更改:

    def rotate_matrix(matrix):
            for i in range(len(matrix)//2):
                for j in range(i, len(matrix)-i-1):
                    matrix[~j][i], matrix[i][j], matrix[j][~i], matrix[~i][~j] = \
                    matrix[~i][~j], matrix[~j][i], matrix[i][j], matrix[j][~i]
            return matrix
    

    做你想要的。


    但是,我会使用 numpy,因为它有一个 built in method 用于旋转矩阵:

    import numpy as np
    mat = np.array([['a','b'],
             ['c','d']])
    
    def rotate_matrix(matrix):
        return np.rot90(matrix, 3) // * SEE NOTE
    
    print(rotate_matrix(mat))
    

    返回:

    [['c' 'a']
     ['d' 'b']]
    


    注意: rot90 方法提供逆时针 旋转。由于您请求 顺时针 旋转,因此您必须指定参数 3 来指定实现顺时针旋转应进行的逆时针旋转量。

    【讨论】:

      【解决方案2】:

      这是您问题的解决方案,您必须正确使用赋值值

      试着看看你正在做的作业,

      就索引而言: (0,0) --> (0,1) , (0,1) --> (1,1), (1,0) -->(0,0) 和 (1,1) --> (1,0) 这是错误的。

      这就是你得到错误解决方案的原因

      你应该做的是将索引匹配为

      (0,0) -->(0,1) , (0,1)-->(0,0) , (1,1)-->(0,1),(1,0) -->(1,1)

      以下是正确的解决方案。

      def rotate_matrix(matrix):
              for i in range(len(matrix)//2):
                  for j in range(i, len(matrix)-i-1):
                     matrix[i][j], matrix[~i][j], matrix[i][~j], matrix[~i][~j]= matrix[~i][j],matrix[i][~j],matrix[i][j],matrix[~i][~j]
              return matrix
      
      a = [
       ['a','b'],
       ['c', 'd']
      ]
      
      print(rotate_matrix(a))
      # output [['c', 'a'], ['b', 'd']]
      

      这是您要解决的问题的解决方案,即矩阵的旋转 在 90 度 # 旋转矩阵的 Python 程序

      # Function to rotate a matrix 
      def rotateMatrix(mat): 
      
          if not len(mat): 
              return
      
          """ 
              top : starting row index 
              bottom : ending row index 
              left : starting column index 
              right : ending column index 
          """
      
          top = 0
          bottom = len(mat)-1
      
          left = 0
          right = len(mat[0])-1
      
          while left < right and top < bottom: 
      
              # Store the first element of next row, 
              # this element will replace first element of 
              # current row 
              prev = mat[top+1][left] 
      
              # Move elements of top row one step right 
              for i in range(left, right+1): 
                  curr = mat[top][i] 
                  mat[top][i] = prev 
                  prev = curr 
      
              top += 1
      
              # Move elements of rightmost column one step downwards 
              for i in range(top, bottom+1): 
                  curr = mat[i][right] 
                  mat[i][right] = prev 
                  prev = curr 
      
              right -= 1
      
              # Move elements of bottom row one step left 
              for i in range(right, left-1, -1): 
                  curr = mat[bottom][i] 
                  mat[bottom][i] = prev 
                  prev = curr 
      
              bottom -= 1
      
              # Move elements of leftmost column one step upwards 
              for i in range(bottom, top-1, -1): 
                  curr = mat[i][left] 
                  mat[i][left] = prev 
                  prev = curr 
      
              left += 1
      
          return mat 
      
      # Utility Function 
      def printMatrix(mat): 
          for row in mat: 
              print row 
      
      
      # Test case 1 
      matrix = [
       ['a','b'],
       ['c', 'd']
      ]
      
      
      
      matrix = rotateMatrix(matrix) 
      # Print modified matrix 
      printMatrix(matrix) 
      
      # output [['c', 'a'], ['b', 'd']]
      

      ps 第二个解决方案来自geeksforgeets

      【讨论】:

      • @DanielPahor 我发布了一个对您的原始算法进行修复的编辑。您的分配逻辑是相反的,这就是矩阵以错误方式旋转的原因。如果这还不够,请编辑您的问题以提出更明确的要求。
      • @DanielPahor 尝试查看您正在执行的作业,根据索引 ( 0,0) 和 (0,1) , (0,1)-> (1,1), (1 ,0) ->(0,0) 和 (1,1) -> (1,0) 这是错误的。这就是为什么你得到错误的解决方案
      猜你喜欢
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2017-05-08
      • 2015-09-03
      • 2012-01-01
      • 1970-01-01
      相关资源
      最近更新 更多