今回は paizaの 「神経衰弱を解くために:part4」の問題に挑戦!
問題概要
-
場に並んでいるカードの配置(
H
×W
の表)と プレイヤー人数N
が与えられる。 -
今の 手番のプレイヤー
P
と、
そのプレイヤーがめくった 2枚のカードの位置 (a
,b
), (A
,B
) が入力される。 -
判定することは2つ:
- めくったカードの 数字が同じかどうか(YES/NO)。
- 次に手番となるプレイヤーの番号。
- 同じ → プレイヤーは変わらず
P
のまま。 - 異なる → 次のプレイヤーに交代(プレイヤー番号は 1〜N で循環する)。
- 同じ → プレイヤーは変わらず
〇 出力
- 1行目 → “
YES
” または “NO
” - 2行目 → 次の手番プレイヤー番号
〇 条件
- 盤面のサイズは最大 13×13、カード総数は52以下。
- 1〜13 の数字でカードが表され、同じ数字は必ずペア(2枚 or 4枚)。
- プレイヤー番号は 1〜N の範囲で循環する。
- (a, b) ≠ (A, B) (同じカードを2回めくることはない)。
入力例:
4 3 2 // H W N
6 6 13
13 5 13
6 3 13
3 6 5
1 // P
4 3 4 1
出力例:
NO
2
✅OK例:
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const [H, W, N] = lines[0].split(' ').map(Number);
const cardsGrid = lines.slice(1, H+1).map(line => line.split(' ').map(Number));
const P = Number(lines[H+1])
const [a, b, A, B] = lines[H+2].split(' ').map(Number);
if (cardsGrid[a-1][b-1] === cardsGrid[A-1][B-1]) {
console.log('YES');
console.log(P);
} else {
console.log('NO');
console.log((P % N) + 1);
}
});
入力の受け取り準備
-
readline
を使って標準入力からデータをlines
配列に格納。
入力データの分解
- 1行目から
H, W, N
(縦、横、プレイヤー数)を取得。 - 次の
H
行からトランプの配置を2次元配列cardsGrid
に格納。 - その次の行から手番のプレイヤー番号
P
を取得。 - さらに次の行から、めくられた2枚のカードの座標 (
a
,b
), (A
,B
) を取得。
カードの比較
-
cardsGrid[a-1][b-1]
とcardsGrid[A-1][B-1]
を比較。 - 同じ数字なら → "
YES
" を出力し、プレイヤー番号P
をそのまま出力。 - 異なる数字なら → "
NO
" を出力し、次のプレイヤー番号(P % N) + 1
を出力。
次のプレイヤー計算
-
P % N + 1
にすることで、プレイヤー番号を 1〜N で循環させる。 - 例:
N=3
,P=3
→ 次は (3 % 3)+1 = 1 となり、1番のプレイヤーに戻る。
📝まとめ
-
2次元配列の座標アクセスに注意(入力は1始まりなので、プログラム上では
-1
して扱う)。 -
条件分岐:
- 数字一致 →
YES
, プレイヤー継続 - 不一致 →
NO
, 次プレイヤー(P % N) + 1
- 数字一致 →
-
循環処理:「最後のプレイヤーの次は1番に戻す」という
%
(剰余)を活用。