• + 0 comments

    JS

    let copy = [];
      let height = matrix.length,
        width = matrix[0].length;
      for (let i = 0; i < matrix.length; i++) {
        copy[i] = [...matrix[i]];
      }
      let begi = 0,
        begj = 0;
      while (height > 0 && width > 0) {
        let endi = height - 1 + begi,
          endj = width - 1 + begi;
        const outerCircleLength = height * 2 + width * 2 - 4;
        const realR = r % outerCircleLength;
        if (realR) {
          const map = {};
          let i = begi,
            j = begj,
            index = 0;
          while (index < outerCircleLength) {
            map[index] = [i, j];
            if (i === begi && j < endj) j++;
            else if (j === endj && i < endi) i++;
            else if (i === endi && j > begj) j--;
            else i--;
            index++;
          }
          let mapN = { ...map };
    
          for (let oldPos = 0; oldPos < outerCircleLength; oldPos++) {
            let [oldX, oldY] = map[oldPos];
            let newPos = (outerCircleLength + (oldPos - realR)) % outerCircleLength;
            let [newX, newY] = mapN[newPos];
            matrix[newX][newY] = copy[oldX][oldY];
          }
        }
        height -= 2;
        width -= 2;
        begi++;
        begj++;
      }
      matrix.forEach((v) => console.log(...v));