演習課題「神経衰弱」
神経衰弱と呼ばれるトランプゲームのシミュレーションをしましょう。
問題をわかりやすくするため、トランプには数字のみ書かれているものと考えます。
また、トランプを縦 H 枚、横 W 枚の長方形の形に並べた状態でスタートすることにします。
ここで、H × W 枚のトランプには 1 〜 13 の数字のうちどれか1つが書かれています。
また、複数のトランプに同じ数字が書かれていることがあります。
プレイヤーが N 人おり、それぞれ 1 〜 N で番号付けられているものとします。
ゲームが始まると、1番の人から以下の手順でプレイしていきます。
* 任意の2枚のトランプを捲る。
* 捲った2枚のトランプに異なる数字が書かれていれば、次のプレイヤーの手番となる。そうでなければ、以下の操作をおこなう。
* 2枚のトランプを取り除き、自分のものとする。
* トランプがすべて取り除かれていれば、ゲームを終了する。
* 手順の先頭に戻る。
ここで、N 番のプレイヤーの次のプレイヤーは 1 番のプレイヤーであるとします。
ゲームの初期状態におけるトランプの配置と、
ゲームが終わるまでに捲られたトランプに関する時系列順の記録が与えられます。
その記録を用いて、各プレイヤーが取り除いたトランプの枚数を求めてください。
※この演習課題は、Javaでのみ解答することができます。
期待する出力値
6
0
#03:問題を解く
前回のチャプターでは、問題文を読みどのように処理していけばよいかを学習しました。
このチャプターでは、実際にコードを書いて解答をつくっていきましょう。
import java.util.*;
public class Main {
public static void main(String[] arg) {
Scanner sc = new Scanner(System.in);
// H と W と N を受け取る
int H = sc.nextInt();
int W = sc.nextInt();
int N = sc.nextInt();
// トランプの並び方を表す t を受け取る
int[][] t = new int[H][W];
for (int h = 0; h < H; h++) {
for (int w = 0; w < W; w++) {
t[h][w] = sc.nextInt();
}
}
// 時系列の長さ L を受け取る
int L = sc.nextInt();
// ゲームの手順の記録を受け取る
int[] a = new int[L];
int[] b = new int[L];
int[] A = new int[L];
int[] B = new int[L];
for (int l = 0; l < L; l++) {
a[l] = sc.nextInt();
b[l] = sc.nextInt();
A[l] = sc.nextInt();
B[l] = sc.nextInt();
}
// 手番を持つプレーヤーを表す変数
int player = 1;
// 各プレーヤーが取り除いたトランプの枚数
int[] count = new int[N];
for (int l = 0; l < L; l++) {
int firstCard = t[a[l] - 1][b[l] - 1];
int secondCard = t[A[l] - 1][B[l] - 1];
if (firstCard == secondCard) {
count[player - 1] += 2;
} else {
player += 1;
if (player == N + 1) {
player = 1;
}
}
}
for (int n = 0; n < N; n++) {
System.out.println(count[n]);
}
}
}
2 3 2
1 2 3
2 1 3
5
1 1 2 1
1 1 1 2
1 1 2 2
1 3 2 3
1 2 2 1
2 5 3
5 8 8 6 3
3 6 3 3 5
8
1 4 2 2
1 3 2 1
2 4 2 3
1 3 1 5
2 5 1 1
2 1 1 2
1 5 2 1
1 2 1 3
Java入門編
https://paiza.jp/works/java/primer
paizaラーニング - 講座一覧
https://paiza.jp/works/courses
このレッスンを受講後に、ぜひCランクにチャレンジしてみてください。
https://paiza.jp/challenges
神経衰弱(オリジナル)
下記の問題をプログラミングしてください。
神経衰弱と呼ばれるトランプゲームのシミュレーションをしましょう。
今回は数字が書かれたトランプのみを考え、ジョーカーは考えません。
まず、トランプを縦 H 枚、横 W 枚の長方形の形に並べた状態でスタートします。
H × W 枚のトランプには 1 〜 13 の数字のうちどれか1つが書かれています。
また、同じ数字が書かれたトランプが複数あります。
プレイヤーが N 人おり、それぞれ 1 〜 N で番号付けられています。
ゲームが始まると、1番の人から、このような手順でプレイしていきます。
・並べられたトランプから2枚のトランプを選び、めくります。
・めくった2枚のトランプに異なる数字が書かれていれば、次のプレイヤーの手番となります。同じ数字であれば、次の操作をおこないます。
・まず、2枚のトランプはめくったプレーヤーのものとなり、取り除かれます。
・トランプがすべて取り除かれた場合、ゲームは終了となります。
・トランプが残っている場合、同じプレーヤーがまた最初の手順に戻り、トランプをめくります。
ここで、N 番のプレイヤーの次のプレイヤーは 1 番のプレイヤーであるとします。
ゲームの初期状態におけるトランプの配置と、ゲームが終わるまでに捲られたトランプに関する時系列順の記録が与えられます。
その記録を用いて、各プレイヤーが取り除いたトランプの枚数を求めてください。
たとえば、入力例1は以下のようになります。
入力される値
入力は以下のフォーマットで与えられます。
H W N
t_{1,1} t_{1,2} ... t_{1,W}
t_{2,1} t_{2,2} ... t_{2,W}
...
t_{H,1} t_{H,2} ... t_{H,W}
L
a_1 b_1 A_1 B_1
a_2 b_2 A_2 B_2
...
a_L b_L A_L B_L
1行目には3つの整数 H, W, Nが入力されます。
H と W はそれぞれ並べられたトランプの縦方向の枚数と横方向の枚数で、N はプレイヤーの数を表します。
続く H 行には、配置されたトランプに書かれた数字が入力されます。
t_{i,j} は i 行 j 列に置かれたトランプに書かれた数字を表します。
次の行には、記録の長さ L が与えられます。
続く L 行には、捲られたトランプの記録が時系列順で与えられます。
これは、a_i 行 b_i 列のトランプと A_i 行 B_i 列のトランプが捲られたことを表します。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
期待する出力
i 行目には i 番目のプレイヤーが取り除いたトランプの枚数を出力してください。
各行の最後は改行し、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。
・1 ≦ H, W ≦ 13
・H × W は52以下の2の倍数
・2 ≦ N ≦ 10
・t_{i,j} は 1, ... ,13 のいずれか
・並べられたトランプの中に、同じ数字が書かれたトランプは2枚または4枚ある
・1 ≦ L ≦ 200
・1 ≦ a_i, A_i ≦ H
・1 ≦ b_i, B_i ≦ W
・a_i 行 b_i 列および A_i 行 B_i 列のトランプは取り除かれていない
・(a_i, b_i) ≠ (A_i, B_i)
入力例1
2 3 2
1 2 3
2 1 3
5
1 1 2 1
1 1 1 2
1 1 2 2
1 3 2 3
1 2 2 1
出力例1
6
0
入力例2
2 5 3
5 8 8 6 3
3 6 3 3 5
8
1 4 2 2
1 3 2 1
2 4 2 3
1 3 1 5
2 5 1 1
2 1 1 2
1 5 2 1
1 2 1 3
出力例2
6
2
2