リバーシの操作(縦横)
を解いてみました。
javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//出力する盤面の行数 H , 列数 W と石を置くマスの y , x 座標である Y , X
const [H, W, Y, X] = lines[0].split(" ").map(Number);
//盤面を作る
let board = lines.slice(1,H + 1).map(line => line.split(""));
//盤面の ( Y , X ) に石を置き
board[Y][X] = '*';
//石を置いたY行目について、Y固定
//石を置いた左側、盤面の中を調べる
for (let i = X - 2; i >= 0; i--) {
//調べる場所が、かつ自分の石があるかつ1つ右に何もない
if (board[Y][i] === '*' && board[Y][i + 1] === '.') {
//中に石を置く。1つ右から石を置いた手前まで
for (let j = i + 1; j < X; j++) {
board[Y][j] = '*';
}
// 新たに置いた石によってさらに石が置けるようになった場合でも
// その時点で操作を終える。
break;
}
}
//同様に石を置いた右側を調べる
for (let i = X + 2; i < W; i++) {
//調べる場所が、盤面の中かつ自分の石があるかつ1つ左に何もない
if (board[Y][i] === '*' && board[Y][i - 1] === '.') {
//中に石を置く
for (let j = i - 1; j > X; j--) {
board[Y][j] = '*';
}
// 新たに置いた石によってさらに石が置けるようになった場合でも
// その時点で操作を終える。
break;
}
}
//石を置いたX列目について
//同様に石を置いた上側へ
for (let i = Y - 2; i >= 0; i--) {
//盤面の中かつ自分の石があるかつ間に何もない
if (board[i][X] === '*' && board[i + 1][X] === '.') {
//中に石を置く
for (let j = i + 1; j < Y; j++) {
board[j][X] = '*';
}
// 新たに置いた石によってさらに石が置けるようになった場合でも
// その時点で操作を終える。
break;
}
}
//同様に石を置いた下側へ
for (let i = Y + 2; i < H; i++) {
//盤面の中かつ自分の石があるかつ間に何もない
if (board[i][X] === '*' && board[i - 1][X] === '.') {
//中に石を置く
for (let j = i - 1; j > Y; j--) {
board[j][X] = '*';
}
// 新たに置いた石によってさらに石が置けるようになった場合でも
// その時点で操作を終える。
break;
}
}
//操作を終えた後の盤面を出力
console.log(board.map(row => row.join("")).join("\n"));