プログラマ-回転マトリクス境界

14901 ワード

x*yマトリクスが存在する場合
マトリクスの矩形範囲(query)を複数回選択し、枠線の数字を時計回りに回転させる
最初の行列では、数字は1から1まで水平方向に増加します.
=>回転がない場合、i行j列の数字は((i-1)columns)+j)
ex)
6行6列から5行2列=>26
= ((5 - 1) 6) + 2 = 26
6,6行列で[(2,2),(5.4)]回りに回転すると、
martixで行単位で計算すると、
ねつ
行(2,2)(2,3)(2,4)
(3,2) (3,4)
(4,2) (4,4)
(5,2) (5,3) (5,4)
ねじる
ターンテーブルを運ぶと
1.{x行=x 1},{y 1<=y列=>行列[x 1-1][y 1-1<=値[8, 9]
2.{x 1<=x行=>マトリクス[x 1-1<=値[8, 9, 10, 16, 22]

  • {x行=x 2},{y 1=>行列[x 2-1][y 1-1<値<=y 2-1]左折
    [8, 9, 10, 16, 22, 28, 27]

  • {x 1=>matrix[x 1<値<=x 2-1][y 1-1]を上に回転
    [8, 9, 10, 16, 22, 28, 27, 26, 20, 14]
  • board最後のindexを前に移動
    [14, 8, 9, 10, 16, 22, 28, 27, 26, 20]
    boardから最高価格を取得
    移行が必要なmartix
    martixの1,1=boardの0インデックス
    マトリックスの1,2=プレートの1インデックス
    martixの1、3=boardの2インデックス
    マトリックスの2,3=プレートの3 index
    行列の3,3=boardの4インデックス
    マトリックスの4,3=プレートの5 index
    マトリックスの4,2=プレートの6 index
    行列の4,1=boardの7インデックス
    行列の3,1=boardの8インデックス
    マトリックスの2,1=プレートの9個のインデックス
    代入
    繰り返し
    function solution(rows, columns, queries) {
        var answer = [];    
        let matrix = [];
    
        for(let i = 1; i <= rows; i++) {
          // row, columns에 따른 행렬 생성
            let row = [];
            for(let j = 1; j <= columns; j++) {
                row.push( ((i - 1) * columns)+ j )    
            }
            matrix.push(row);
        }
        
        for(query of queries) {
          
            let x1 = query[0] -1; // index로 접근해야하니 -1 
            let x2 = query[2] -1; 
            let y1 = query[1] -1; 
            let y2 = query[3] -1; 
            
            let board = rotate(x1, y1, x2, y2, matrix)
            answer.push(Math.min(...board) ) // 최솟값
            
          // 돌려야하는 matrix에 대입
            for(let i = y1; i < y2; i++) {
                matrix[x1][i] = board.shift();
            }
            
            for(let i = x1; i < x2; i++) {
                matrix[i][y2] = board.shift();
            }
            
            for(let i = y2; i > y1; i--) {
                matrix[x2][i] = board.shift();
            }
            
            for(let i = x2; i > x1; i--) {
                matrix[i][y1] = board.shift();
            }
        }
        return answer;
    }
    
    function rotate(x1, y1, x2, y2, matrix) {
        let board = [];
    
        for(let i = y1; i < y2; i++) { // 오른쪽으로 돌려야하는 값 
            board.push(matrix[x1][i])
        } 
       
        for(let i = x1; i < x2; i++) { // 아래쪽
            board.push(matrix[i][y2])
        }
        
    
        for(let i = y2; i > y1; i--) {  /// 왼쪽
            board.push(matrix[x2][i])
        }
            
        for(let i = x2; i > x1; i--) { // 위쪽
            board.push(matrix[i][y1])
        };
           
        board.unshift(board.pop()); // 마지막 index 앞으로
        return board;
            
        };