新・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(' '));
});
});
長いコードになってしまいました。
【マップのナンバリング】コード 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(' '));
}
});
C++の実装例を参照しました。
コメント