新・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);
});
空き箱でサイコロ作って線を引きながらコード書きました。
(^_^;)
【配列 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);
});
実装例 C++の場合を参照。
コメント