【paiza】スキルチェック過去問題セット:神経衰弱 (paizaランク B 相当) 解答例 – PHP編
この問題はpaiza動画講座の「スキルチェック入門編」 > 「スキルチェック入門編6: 神経衰弱 (Bランク) (全3回) 」で解説されています。
多次元配列を使えるかが鍵となる問題です。多次元配列使用して座標のカード情報を取得し、2つのカードが同じならターンプレイヤーのカード枚数を2つ上げ、違う場合ならターンプレイヤーを変更するプログラムを作成します。動画を見ていたからなんとか解けたものの、予備知識がないとガチモンの初心者はこのあたりで躓くかも…
解答例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php $input_line = explode(" ",trim(fgets(STDIN))); $h = $input_line[0];//トランプの行数 $w = $input_line[1];//トランプの列数 $n = $input_line[2];//プレイヤ-人数 for($i = 0;$i < $h;$i++){ $carddata[] = explode(" ",trim(fgets(STDIN))); } $worknum = trim(fgets(STDIN)); for($i =0;$i < $worknum ;$i++){ $cardwrok[] = explode(" ",trim(fgets(STDIN))); } for($i = 0;$i < $n;$i++){ $pleyerdata[$i] = 0; } $pleyerflag =0; for($i = 0;$i < $worknum;$i++){ if($carddata[$cardwrok[$i][0]-1][$cardwrok[$i][1]-1] == $carddata[$cardwrok[$i][2]-1][$cardwrok[$i][3]-1]){ $pleyerdata[$pleyerflag] += 2; } else { $pleyerflag++; if($pleyerflag > ($n-1)){ $pleyerflag=0; } } } foreach($pleyerdata as $value){ echo $value."\n"; } ?> |
解答方針
与えられる情報から、どの位置(座標)に何のカードがあるかというカード情報を格納する配列「$carddata」、めくられたカードの座標を格納する配列「$carddata」、プレイヤーが獲得したカード枚数を格納する「$pleyerdata」という配列を作り、実行結果から解答を導きます。
標準入力からトランプの行数、列数、プレイヤーの人数を取得する
|
1 2 3 4 5 |
$input_line = explode(" ",trim(fgets(STDIN))); $h = $input_line[0];//トランプの行数 $w = $input_line[1];//トランプの列数 $n = $input_line[2];//プレイヤ-人数 |
ちなみに今回、「$w」は使用しません。
各データの配列を作成する
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
for($i = 0;$i < $h;$i++){ $carddata[] = explode(" ",trim(fgets(STDIN))); //何のカードがどのような配置で並んでいるかのデータを「$carddata」に格納する } $worknum = trim(fgets(STDIN)); //カードを2枚、めくった回数を取得 for($i =0;$i < $worknum ;$i++){ $cardwrok[] = explode(" ",trim(fgets(STDIN))); //めくったカードの座標データを「$cardwork」に格納する } for($i = 0;$i < $n;$i++){ $pleyerdata[$i] = 0; //プレイヤーの人数分、取得カード枚数の初期「0」を入れる } $pleyerflag =0;//ターンプレイヤーを管理する変数 |
「$carddata」…カードの配置情報を格納する多次元配列
「$cardwrok」…めくったカード情報を格納する多次元配列
「$pleyerdata」…プレイヤーのカード取得枚数を記録する多次元配列
「$pleyerflag」…ターンプレイヤーを管理する変数
神経衰弱をプレイ
|
1 2 3 4 5 |
for($i = 0;$i < $worknum;$i++){ if($carddata[$cardwrok[$i][0]-1][$cardwrok[$i][1]-1] == $carddata[$cardwrok[$i][2]-1][$cardwrok[$i][3]-1]){ $pleyerdata[$pleyerflag] += 2; } else { $pleyerflag++; if($pleyerflag > ($n-1)){ $pleyerflag=0; } } } |
そしてカードが一致してた場合、「$pleyerdata[$pleyerflag] += 2;」とすることで、ターンプレイヤーのカード枚数を2増やし、このままターンプレイヤーを継続させます。
「else」の場合、「$pleyerflag++;」とすることで、ターンプレイヤーが切り替わります。
