【シミュレーション】FINAL問題 シミュレーション (paizaランク C 相当) 解答例 – PHP編【Cランクレベルアップメニュー】
【Cランクレベルアップメニュー】 > 【シミュレーション】FINAL問題 シミュレーション (paizaランク C 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
カウンター合戦のシュミレーション問題です。少々プログラムの構築の仕方に悩むかもしれませんが、「for」か「while」、配列の基本が使えるなら十分攻略可能な問題です。
解答例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php $paizahp = trim(fgets(STDIN)); $paizaattack = [1,1]; $enemyattack = [1,1]; for($i = 0;$paizahp > 0;$i++){ if($i < 2){ $enemydamage[] = $paizaattack[$i]; } else { $enemydamage[] = $paizadamage[$i-1] + $paizadamage[$i-2]; } if($i < 2){ $paizadamage[] = $enemyattack[$i]; } else { $paizadamage[] = ($enemydamage[$i-1] * 2) + $enemydamage[$i-2]; } $paizahp -= $paizadamage[$i]; } echo $i; ?> |
解答方針
パイザ君と敵の攻撃力が、受けたダメージとターンによって変化していきます。パイザ君のHPがなくなるまで処理が続き、何ターンでパイザ君のHPがなくなるか検証する問題です。
1,2ターン目の攻撃力はパイザ君も敵も「1」ですが、3ターン目以降の攻撃力の条件は次の通りです。
カウンターの法則パイザ君:モンスターから受けた (n – 1) 回目の攻撃のダメージ) + (モンスターから受けた (n – 2) 回目の攻撃のダメージ
敵:パイザ君から受けた (n – 1) 回目の攻撃のダメージ) * 2 + (パイザ君から受けた (n – 2) 回目の攻撃のダメージ
この法則を再現し、パイザ君のHPが0になるまで処理を繰り返します。
情報を取得する
|
1 2 3 |
$paizahp = trim(fgets(STDIN)); //パイザ君のHPを取得する $paizaattack = [1,1]; //パイザ君の1,2ターン目の攻撃力 $enemyattack = [1,1]; //敵の1,2ターン目の攻撃力 |
パイザ君のHPが0になるまで処理を繰り返す
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
for($i = 0;$paizahp > 0;$i++){ //パイザ君のHPが0になるまで処理を繰り返す /*---------------------------------パイザ君のターン----------------------------------*/ if($i < 2){ // 2ターン目までの処理 $enemydamage[] = $paizaattack[$i]; //敵へのダメージを記録する配列にパイザ君の攻撃力(1)を入れる } else { //3ターン目以降の処理 $enemydamage[] = $paizadamage[$i-1] + $paizadamage[$i-2]; //敵へのダメージを記録する配列に「パイザ君が 1ターン前に受けたダメージ + 2ターン前に受けたダメージ」を入れる } /*---------------------------------パイザ君のターン終了----------------------------------*/ /*---------------------------------敵のターン----------------------------------*/ if($i < 2){ // 2ターン目までの処理 $paizadamage[] = $enemyattack[$i]; //パイザ君へのダメージを記録する配列に敵の攻撃力(1)を入れる } else { //3ターン目以降の処理 $paizadamage[] = ($enemydamage[$i-1] * 2) + $enemydamage[$i-2]; //パイザ君へのダメージを記録する配列に「敵が (1ターン前に受けたダメージ × 2) + 2ターン前に受けたダメージ」を入れる } /*---------------------------------敵のターン終了----------------------------------*/ $paizahp -= $paizadamage[$i]; //パイザ君のHPを減らす } echo $i; //処理が中断したターンを出力する |
