[JS]Sprial Matrix


えーと、、、、ユデミの授業で解いた問題は、問題の名前はよくわかりませんが、スピアールMatrixにします.
)
--- Directions
Write a function that accepts an integer N
and returns a NxN spiral matrix.
--- Examples
matrix(2)
[[1, 2],
[4, 3]]
matrix(3)
[[1, 2, 3],
[8, 9, 4],
[7, 6, 5]]
matrix(4)
[[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]]
このように回転する2 Dアレイを作るのが狙い!
Spiral Matrix
My Code
function matrix(n) {
  let results = Array.from(Array(n), () => new Array(n));
  let counter = 1;
  let startColumn = 0,
    startRow = 0,
    endColumn = n - 1,
    endRow = n - 1;
  // startColumn <= endColumn && startRow <= endRow
  while (counter <= n * n) {
    for (let i = startColumn; i <= endColumn; i++) {
      results[startRow][i] = counter;
      counter++;
    }
    startRow++;
    for (let i = startRow; i <= endRow; i++) {
      results[i][endColumn] = counter;
      counter++;
    }
    endColumn--;
    for (let i = endColumn; i >= startColumn; i--) {
      results[endRow][i] = counter;
      counter++;
    }
    endRow--;
    for (let i = endRow; i >= startRow; i--) {
      results[i][startColumn] = counter;
      counter++;
    }
    startColumn++;
  }
  return results;
}
説明:

  • 2 Dアレイを宣言する方法
    row : a
    column: b
    let results = Array.from(Array(a), () => new Array(b));
    for文を使用して宣言することができるが、es 6ではfromメソッドを使用して宣言することができる.
    MDN fromメソッド
  • start column、endcolumn、start row、endrowを使用して、末尾に4行を入力します.
    javascriptは空の配列に直接入れることができるので、初期化せずに空の配列のみを宣言します.

  • 先頭行を塗りつぶします.for i startColumnendColumnresult[startRow][i]counterを入れるcounter++

  • 1行目は記入済みですstartRow++

  • endColumn充填--i startRowからendRowに使用result[i][endColumn]counterを入れるcounter++

  • 最後の行に記入しました.endColumn--です.

  • 下の行を塗りつぶします.for i endColumnstartColumnresult[endRow][i]counterを入れるcounter++

  • 一番下の行が埋め込まれています.endRow--です.

  • 一番左の行を塗りつぶします.for i endRowstartRowresult[i][startColumn]counterを入れるcounter++

  • 一番左がstartRow++
  • Column<=endColumn&&startRow<=endRowを起動
    または
    カウンタ<=n*nでよい.
    アルゴリズムベースsprial終了~~
    ソース:レッスンリンク