マップのナンバリング《新・Bランクup》

新・Bランクレベルアップ 【マップの扱い 4】マップのナンバリング

【マップのナンバリング】コード 1/2

reader.on('close', () => {
   const upper_right = (H, W) => {  // D = 1 ↑右斜上方向へ
      for (let h = 0; h < H; h++) {
         let h2 = h;
         for (let w = 0; w <= h && w < W; w++) {
            MAP[h2][w] = n;
            MAP[H - h2 - 1][W - w - 1] = H * W - n + 1;
            n++;
            h2--;
         }
         if (h === H - 1) {
            let w2 = 0;
            let h2 = H;
            let w3 = w2;
            while (MAP[1].includes(0)) {
               while (h2 > 0 && w3 < W - 2) {
                  w3++;
                  h2--;
                  MAP[h2][w3] = n;
                  n++;
               }
               w2++;
               h2 = H;
               w3 = w2;
            }
         }
      }
   };
   const left_right = (H, W) => {  // D = 2 →右から左へ
      for (let h = 0; h < H; h++) {
         for (let w = 0; w < W; w++) {
            MAP[h][w] = n;
            n++;
         }
      }
   };

   const up_down = (H, W) => {  // D = 3 ↓上から下へ
      for (let w = 0; w < W; w++) {
         for (let h = 0; h < H; h++) {
            MAP[h][w] = n;
            n++;
         }
      }
   };

   const lower_left = (H, W) => {  // D = 4 ↓左斜下方向へ
      for (let w = 0; w < W; w++) {
         let w2 = w;
         for (let h = 0; h <= w && h < H; h++) {
            MAP[h][w2] = n;
            MAP[H - h - 1][W - w2 - 1] = H * W - n + 1;
            n++;
            w2--;
         }
         if (w === W - 1) {
            let h2 = 0;
            let w2 = W;
            let h3 = h2;
            while (MAP.flat().includes(0)) {
               while (h2 < H && w2 > 0) {
                  w2--;
                  h3++;      
                  MAP[h3][w2] = n;
                  n++;
               }
               h2++;
               w2 = W;
               h3 = h2;
            }
         }
      }
   };
   const [H, W, D] = lines[0].split(' ').map(Number);  // 行数 H 列数 W 向き D
   const MAP = [];
   let n = 1;
   for (let h = 0; h < H; h++) {
      MAP.push([]);
      for (let w = 0; w < W; w++) {
         MAP[h].push(0);
      }
   }
   switch (D) {
   case 1:
      upper_right(H, W);
      break;
   case 2:
      left_right(H, W);
      break;
   case 3:
      up_down(H, W);
      break;
   case 4:
      lower_left(H, W);
      break;
   }
   MAP.forEach(m => {
      console.log(m.join(' '));
   });
});
hogeちゃんの画像

長いコードになってしまいました。

【マップのナンバリング】コード 2/2

reader.on('close', () => {
   const [H, W, D] = lines[0].split(' ').map(Number);  // 行数 H 列数 W 向き D
   let count = 1;
   const A = [];
   for (let h = 0; h < H; h++) {
      A.push([]);
   }
   switch (D) {
   case 1:
      A[0][0] = 1;
      count++;
      for (let i = 1; i < H; i++) {
         for (let j = 0; j <= Math.min(i, W - 1); j++) {
            A[i - j][j] = count;
            count++;
         }
      }
      for (let i = 1; i < W; i++) {
         for (let j = 0; j < Math.min(H, W - i); j++) {
            A[H - 1 - j][i + j] = count;
            count++;
         }
      }
      break;
   case 2:
      for (let i = 0; i < H; i++) {
         for (let j = 0; j < W; j++) {
            A[i][j] = count;
            count++;
         }
      }
      break;
   case 3:
      for (let i = 0; i < W; i++) {
         for (let j = 0; j < H; j++) {
            A[j][i] = count;
            count++;
         }
      }
      break;
   case 4:
      A[0][0] = 1;
      count++;
      for (let i = 1; i < W; i++) {
         for (let j = 0; j <= Math.min(i, H - 1); j++) {
            A[j][i - j] = count;
            count++;
         }
      }
      for (let i = 1; i < H; i++) {
         for (let j = 0; j < Math.min(H - i, W); j++) {
            A[i + j][W - 1 - j] = count;
            count++;
         }
      }
   }
   for (let i = 0; i < H; i++) {
      console.log(A[i].join(' '));
   }
});
hogeちゃんの画像

C++の実装例を参照しました。

コメント