回転マトリクス境界(Programmers 77485)


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


マトリクスのサイズは
  • 行x列です.行列の数字は1からrows x columnsの順に1行です.この行列で長方形の範囲を複数回選択し、枠線部分の数値を時計回りに回転させます.各回転は4つの整数(x 1、y 1、x 2、y 2)で表され、その意味は以下の通りである.
  • x 1行y 1列からx 2行y 2列に対応する領域の矩形では、枠の数字を時計回りに回転させる.
  • 以下は、6 x 6サイズマトリクスの例である.
  • がこの行列に回転(2、2、5、および4)を適用すると、領域の枠線が時計回りに回転し、下図のように2行2列から5行4列になります.このとき、中央に15と21がある領域を回転させないように注意しましょう.
  • 行列の縦(行数)行、横(列数)列、および回転のリストクエリが与えられた場合、各回転を配列に適用し、その回転によって位置を変更した数値のうち最小の数値を配列に順番に戻して解く関数を完了します.
  • せいげんじょうけん

  • 行は2または100以下の自然数です.
  • 列は2以上100以下の自然数です.
  • が始まると、行列には1から1までの横方向の数字が増えていると書かれています.
  • 、すなわち、回転がない場合、i行j列の数字は(i-1)x columns+jとなる.
  • クエリのロー数(回転数)は10000より大きい.
  • クエリの各ローは、4つの整数[x 1、y 1、x 2、y 2]である.
  • x 1行のy 1列からx 2行のy 2列まで時計回りに領域の枠を回転させる.
  • 1≦x 1すべての回転は順番に行われます.
  • 例えば、2番目の回転の答えは、1番目の回転を実行し、その状態で2番目の回転を実行したときに、移動する数字の最大値を求めることである.

    I/O例


    rowscolumnsqueriesresult66[[2,2,5,4],[3,3,6,6],[5,1,6,3]][8, 10, 25]33[[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]][1, 1, 5, 3]10097[[1,1,100,97]][1]

    🧑‍💻 解決策

  • リストに空のセルを作成する必要があります.tmpに設定します.
  • セグメントごとに1つのセグメントを移動し、値を適用します.
  • 🧑‍💻 コード#コード#

    def turning(query, frame):
       turned_num = []
       top, left, bottom, right = query[0] - 1, query[1] - 1, query[2] - 1, query[3] - 1
    
       tmp = frame[top][left]
       for y in range(top, bottom):
           frame[y][left] = frame[y + 1][left]
           turned_num.append(frame[y][left])
    
       for x in range(left, right):
           frame[bottom][x] = frame[bottom][x + 1]
           turned_num.append(frame[bottom][x])
    
       for y in range(bottom, top, -1):
           frame[y][right] = frame[y - 1][right]
           turned_num.append(frame[y][right])
    
       for x in range(right, left, -1):
           frame[top][x] = frame[top][x - 1]
           turned_num.append(frame[top][x])
    
       turned_num.append(tmp)
       frame[top][left + 1] = tmp
    
       return frame, min(turned_num)
    
    def solution(rows, columns, queries):
       answer = []
    
       # 틀 형성
       frame = []
       for i in range(1, rows + 1):
           tmp = []
           for j in range(1, columns + 1):
               num = ((i - 1) * columns + j)
               tmp.append(num)
           frame.append(tmp)
    
       # 실행을 위한 구문
       for query in queries:
           frame, minimum = turning(query, frame)
           answer.append(minimum)
    
       return answer

    🧑‍💻 総評

  • クイズのように考えるのは簡単です.
  • のアイデアを思いつくまでに時間がかかったが、その後の解決は難しくなかった.
  • 最近level 2にかなり緊張して、また自信を取り戻しました.