[Programmers]Lv 2マトリクスボーダーJavaScriptの回転


完全なソースコード

function solution(rows, columns, queries) {
  
    let answer = [];
    let myArray = Array.from(new Array(rows), () => new Array(columns).fill(1))
                    .map((row, r) => row.map((v, c) => (r * columns) + (c + 1)));

    for (let query of queries) {
        let row1 = query[0]-1;
        let col1 = query[1]-1;
        let row2 = query[2]-1;
        let col2 = query[3]-1;

        let tmpArr = new Array();

        for (let idx = col1; idx < col2; idx++) { tmpArr.push(myArray[row1][idx]); }
        for (let idx = row1; idx < row2; idx++) { tmpArr.push(myArray[idx][col2]); }
        for (let idx = col2; idx > col1; idx--) { tmpArr.push(myArray[row2][idx]); }
        for (let idx = row2; idx > row1; idx--) { tmpArr.push(myArray[idx][col1]); }
        
        tmpArr.unshift(tmpArr.pop());

        let cnt = 0;
        for (let idx = col1; idx < col2; idx++) { myArray[row1][idx] = tmpArr[cnt++]; }
        for (let idx = row1; idx < row2; idx++) { myArray[idx][col2] = tmpArr[cnt++]; }
        for (let idx = col2; idx > col1; idx--) { myArray[row2][idx] = tmpArr[cnt++]; }
        for (let idx = row2; idx > row1; idx--) { myArray[idx][col1] = tmpArr[cnt++]; }

        answer.push(Math.min(...tmpArr));
    }
  
    return answer;
  
}

問題の説明


行x columnsサイズのマトリクス.行列の数字は1からrows x columnsの順に1行です.
この行列で長方形の範囲を複数回選択し、枠線部分の数値を時計回りに回転させます.各回転は4つの整数(x 1,y 1,x 2,y 2)で表される.
行列の行、列および回転リスト[(x 1、y 1、x 2、y 2)...]与えられたタイミングで、各回転をマトリクスに適用し、その回転によって位置を変更する数値. 最小の数字を配列に順番に入れて返す問題.

I/O例


rowscolumnsqueriesresult66[[2,2,5,4],[3,3,6,6],[5,1,6,3]][8, 10, 25]
  • の例では、回転リストを実行する手順を次の図に示します.

  • 問題自体は難しくありませんが、宣言と初期化の過程で、ES 6構文はすでに熟知しており、きれいなコードを書く必要があります.これは理解しにくいです.
    これはあなたが覚えて勉強できるようにするためです.
    コメントサイト:
    プログラマ-回転マトリクス境界