29:時計回りプリントマトリックス(剣指offer第2版Python)


1、テーマの説明
1つのマトリクスを入力、各数字を時計回りに順次印刷し、例えば、1 2 3 4 4 4 5 6 6 7 8 8 11 12 13 14 16を入力と、1,2,3,4,8,12,16,15,14,13,9,6,7,11,10の順に印刷する.
      ,                       ,
  ,        :
[[ 1,  2,  3,  4],
 [ 5,  6,  7,  8],
 [ 9, 10, 11, 12],
 [13, 14, 15, 16]]
         1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

2、コードの詳細
まず、各ステップが開始する座標点が行数の半分未満かつ列数の半分未満を満たすかどうかを判断する必要があります.最後のループでは、右に1行しか歩けない可能性があります.右に1行だけ歩いて下に1列、右に1行ずつ下に1列ずつ歩いて左に1行、完全に1周できる4つのケースがあります.そのうち左に1行しか歩けないのは必然的に発生し、判断する必要はなく、残りは発生条件を判断する必要がある.
まず、2 Dリストの行と列を見てみましょう.
matrix3 = [[1,2],[3,4],[5,6],[7,8],[9,10]]
rows = len(matrix3)   #   
columns = len(matrix3[0])   #   
print(rows)     # 5 
print(columns)  # 2

コードは次のとおりです.
# -*- coding:utf-8 -*-
class Solution:
    # matrix       ,      
    #                
    def printMatrix(self, matrix):
        printArr = [] #    
        if matrix == None:
            return
        if matrix == []:
            return []
        start = 0               #         
        rows = len(matrix)   #   
        columns = len(matrix[0])   #   


        while columns > 2 * start and rows > 2 * start:
            #   start    0  
            endX = columns - 1 - start #     
            endY = rows - 1 - start #     

            #          printArr
            for i in range(start, endX + 1):
                number = matrix[start][i]
                printArr.append(number)

            #          printArr
            #      >     ,    
            if start < endY:
                for i in range(start + 1, endY + 1):
                    number = matrix[i][endX]
                    printArr.append(number)

            #          printArr
            #      >     ,       >     
            if start < endX and start < endY:
                for i in range(endX - 1, start - 1, -1):
                    number = matrix[endY][i]
                    printArr.append(number)

            #          printArr
            #      >     ,        >      + 1(   2)
            if start < endX and start < endY - 1:
                for i in range(endY - 1, start, -1):
                    number = matrix[i][start]
                    printArr.append(number)

            #    ,      
            start += 1
        return printArr

matrix = [[1,  2,  3,  4],
          [5,  6,  7,  8],
          [9, 10, 11, 12],
          [13, 14, 15, 16]]
matrix2 = [[1],[2],[3],[4],[5]]
matrix3 = [[1,2],[3,4],[5,6],[7,8],[9,10]]
S = Solution()
print(S.printMatrix(matrix))
print(S.printMatrix(matrix2))
print(S.printMatrix(matrix3))