[プログラマ]回転マトリクスフレーム/Python/実装


かいてんマトリクスきょうかい


  • 問題の説明
    行x columnsサイズのマトリクス.行列の数字は1からrows x columnsの順に1行です.この行列で長方形の範囲を複数回選択し、枠線部分の数値を時計回りに回転させます.各回転は4つの整数(x 1、y 1、x 2、y 2)で表され、その意味は以下の通りである.
    x 1行y 1列からx 2行y 2列に対応する領域の矩形から、枠の中の数字の1つを時計回りに回転させる.
    次に、6 x 6サイズマトリクスの例を示します.

    この行列に回転(2,2,5,4)を適用すると、領域の枠線が時計回りに回転し、下図のように2行2列から5行4列になります.このとき、中央に15と21がある領域を回転させないように注意しましょう.

    行列の縦長(行数)行、横長(列数)列、および回転リストをクエリーする場合は、各回転を配列に適用し、回転位置によって変更された数値の最小値を配列に順番に戻して解く関数を完了します.

  • せいげんじょうけん
    -rowsは2または100未満の自然数です.
    −columnsは2または100未満の自然数である.
    -最初は、行列の数字が1から水平方向に増加します.
    すなわち、回転がない場合、i行j列の数字は(i−1)x columns+jとなる.
    -queryの行数(回転数)は少なくとも10000です.
    -queryの各行は4つの整数[x 1,y 1,x 2,y 2]である.
    -x 1行y 1列からx 2行y 2列まで時計回りに回転する領域の枠線.
    -1≤x1-すべての回転は順番に行われます.
    例えば、2番目の回転の答えは、1番目の回転を実行し、その状態で2番目の回転を実行したときに、移動する数字の最大値を求めることである.
  • 解答方法

  • 長方形の各辺を回転します.次のエッジを回転させるときに使用するには、頂点の数値を保存する必要があります.
  • 2상단 가로 → 오른쪽 세로 → 하단 가로 → 왼쪽 세로の順番で回りたいです.この場合、構築ポイントの位置ではなく、1つのセルの横の位置からfor文を開始することに注意してください.
  • def solution(rows, columns, queries):
        
        arry = [[0] * columns for _ in range(rows)]
        num = 1
        for i in range(rows):
            for j in range(columns):
                arry[i][j] = num
                num += 1
                
        answer = []
        for x1, y1, x2, y2 in queries: # 2, 2, 5, 4    
            prev = arry[x1 - 1][y1 - 1] # 왼쪽 위 꼭짓점 저장
            min_value = prev
            
            # 상단 가로
            for j in range(y1, y2):
                curr = arry[x1 - 1][j] 
                arry[x1 - 1][j] = prev # 이전에 저장해둔 값으로 바꿈
                min_value = min(min_value, curr)
                prev = curr # 방금 바뀐 위치에 들어있던 값으로 업데이트
     
            # 오른쪽 세로
            for i in range(x1, x2):
                curr = arry[i][y2 - 1]
                arry[i][y2 - 1] = prev
                min_value = min(min_value, curr)
                prev = curr
    
            # 하단 가로
            for j in range(y2 - 2, y1 - 2, -1):
                curr = arry[x2 - 1][j]
                arry[x2 - 1][j] = prev
                min_value = min(min_value, curr)
                prev = curr
    
            # 왼쪽 세로
            for i in range(x2 - 2, x1 - 2, -1):
                curr = arry[i][y1 - 1]
                arry[i][y1 - 1] = prev
                min_value = min(min_value, curr)
                prev = curr
    
            answer.append(min_value)
    
        return answer