【配列2】立体で計算《新・Bランクup》

新・Bランクレベルアップメニュー 【配列 2】立体で計算

【配列 2】立体で計算  コード 1/2

reader.on('close', () => {
   const N = Number(lines[0]);
   const A = [];
   for (let i = 0; i < N; i++) {
      A.push([]);
      for (let j = 1; j <= N; j++) {
         A[i].push(lines[j + i * N].split(' ').map(Number));
      }
   }
   let ans = 0;
   sum3D(A, N - 1);
   for (let z = 0; z < N; z++) {
      sum2d(A[z]);
   }

   function sum3D(a, n) {
      const cross_center = [0, 0, 0, 0];  // 中心で交差
      for (let z = 0; z < N; z++) {
         cross_center[0] += a[z][z][z];  // 奥左上→前右下
         cross_center[1] += a[z][z][n - z];  // 奥右上→前左下
         cross_center[2] += a[z][n - z][z];  // 奥左下→前右上
         cross_center[3] += a[z][n - z][n - z];  // 奥右下→前左上
         const crossr = [0, 0, 0, 0, 0, 0];  // 斜め方向
         for (let y = 0; y < N; y++) {  // [奥行き][高さ][横幅]
            crossr[0] += a[z][y][y];  // 左上→右下
            crossr[1] += a[z][y][n - y];  // 右上→左下
            crossr[2] += a[y][y][z];  // 奥上→前下
            crossr[3] += a[N - 1 - y][y][z];  // 奥下→前上
            crossr[4] += a[y][z][y];  // 奥左→前右
            crossr[5] += a[y][z][n - y];  // 右上→左下
            let deep = 0;
            for (let x = 0; x < N; x++) {
               deep += a[x][y][z];  // 奥→前
            }
            ans = Math.max(ans, deep);
         }
         ans = Math.max(ans, ...crossr);
      }
      ans = Math.max(ans, ...cross_center);
   }

   function sum2d(a) {
      for (let y = 0; y < N; y++) {
         let [row, col] = [0, 0];
         for (let x = 0; x < N; x++) {
            row += a[y][x];  // 右→左
            col += a[x][y];  // 上→下
         }
         ans = Math.max(ans, row, col);
      }
   }
   console.log(ans);
});
hogeちゃんの画像

空き箱でサイコロ作って線を引きながらコード書きました。

(^_^;)

【配列 2】立体で計算  コード 2/2 (C++実装例参照)

reader.on('close', () => {
   const N = Number(lines[0]);
   const A = [];
   for (let i = 0; i < N; i++) {
      A.push([]);
      for (let j = 1; j <= N; j++) {
         A[i].push(lines[j + i * N].split(' ').map(Number));
      }
   }
   let ans = 0;
   for (let x = 0; x < N; x++) {
      for (let i = 0; i < N; i++) {
         let row_sum = 0;
         for (let j = 0; j < N; j++) {
            row_sum += A[x][i][j];
         }
         ans = Math.max(row_sum, ans);
      }
   }
   for (let y = 0; y < N; y++) {
      for (let i = 0; i < N; i++) {
         let row_sum = 0;
         let col_sum = 0;
         for (let j = 0; j < N; j++) {
            row_sum += A[i][y][j];  // 天井 底面 左から
            col_sum += A[j][y][i];  // 左壁 右壁 奥上から
         }
         ans = Math.max(row_sum, col_sum, ans);
      }
   }
   for (let z = 0; z < N; z++) {
      for (let i = 0; i < N; i++) {
         let row_sum = 0;
         let col_sum = 0;
         for (let j = 0; j < N; j++) {
            row_sum += A[i][j][z];  // 奥壁 前壁 左から
            col_sum += A[j][i][z];
         }
         //   console.log(row_sum, col_sum);
         ans = Math.max(row_sum, col_sum, ans);
      }
   }
   for (let x = 0; x < N; x++) {
      let left_right_down = 0;
      let left_right_up = 0;
      for (let i = 0; i < N; i++) {
         left_right_down += A[x][i][i];
         left_right_up += A[x][N - 1 - i][i];
      }
      ans = Math.max(left_right_down, left_right_up, ans);
   }
   for (let y = 0; y < N; y++) {
      let left_right_down = 0,
         left_right_up = 0;
      for (let i = 0; i < N; i++) {
         left_right_down += A[i][y][i];
         left_right_up += A[N - 1 - i][y][i];
      }
      ans = Math.max(left_right_down, left_right_up, ans);
   }
   for (let z = 0; z < N; z++) {
      let left_right_down = 0,
         left_right_up = 0;
      for (let i = 0; i < N; i++) {
         left_right_down += A[i][i][z];
         left_right_up += A[i][N - 1 - i][z];
      }
      ans = Math.max(left_right_down, left_right_up, ans);
   }
   let [l_1, l_2, l_3, l_4] = [0, 0, 0, 0];
   for (let i = 0; i < N; i++) {
      l_1 += A[i][i][i];
      l_2 += A[i][N - 1 - i][N - 1 - i];
      l_3 += A[i][N - 1 - i][i];
      l_4 += A[i][i][N - 1 - i];
   }
   ans = Math.max(ans, l_1, l_2, l_3, l_4);
   console.log(ans);
});
hogeちゃんの画像

実装例 C++の場合を参照。

コメント