新・Bランクレベルアップ【マップの扱い3】マップの判定・縦横斜め
【マップの判定・縦横斜め】コード 1/2
reader.on('close', () => {
const change = (y, x) => {
S[y][x] === '.' ? S[y][x] = '#' : S[y][x] = '.';
};
const [H, W] = lines[0].split(' ').map(Number); // 行数 H , 列数 W の盤面
const S = [];
const [y, x] = lines[H + 1].split(' ').map(Number);
for (let i = 1; i <= H; i++) {
S.push(lines[i].split(''));
}
change(y, x); // 中心
for (let z = 1; z < Math.max(H, W); z++) {
if (y - z >= 0) {
change(y - z, x); // 上
}
if (y + z < H) {
change(y + z, x); // 下
}
if (x + z < W) {
change(y, x + z); // 右
}
if (x - z >= 0) {
change(y, x - z); // 左
}
if (y + z < H && x + z < W) {
change(y + z, x + z); // 右下
}
if (y - z >= 0 && x - z >= 0) {
change(y - z, x - z); // 左上
}
if (y + z < H && x - z >= 0) {
change(y + z, x - z); // 左下
}
if (y - z >= 0 && x + z < W) {
change(y - z, x + z); // 右上
}
}
for (let i = 0; i < H; i++) {
console.log(S[i].join(''));
}
});
とりあえずup。
【マップの判定・縦横斜め】コード 2/2 (C++実装例参照)
reader.on('close', () => {
const change = (h, w) => {
S[h][w] === '.' ? S[h][w] = '#' : S[h][w] = '.';
};
const [H, W] = lines[0].split(' ').map(Number);
const S = [];
const [y, x] = lines[H + 1].split(' ').map(Number);
for (let i = 1; i <= H; i++) {
S.push(lines[i].split(''));
}
for (let i = 0; i < H; i++) {
change(i, x);
}
for (let i = 0; i < W; i++) {
change(y, i);
}
for (let i = 1; i < Math.min(H, W); i++) {
if (y + i < H) {
if (x + i < W) {
change(y + i, x + i);
}
if (0 <= x - i) {
change(y + i, x - i);
}
}
if (0 <= y - i) {
if (x + i < W) {
change(y - i, x + i);
}
if (0 <= x - i) {
change([y - i], [x - i]);
}
}
}
change(y, x);
for (const s of S) {
console.log(s.join(''));
}
});
C++の実装例を参照しました。
コメント