問題
解答
うっす。
今回の問題はかなり楽しくできました。RPGゲームとかの範囲攻撃はこんな感じで作られてんのかな。
大まかな流れとしては
- 敵の配列作成
- 魔法範囲を作成
- 総ダメージ量の配列作成
- 敵の体力と総ダメージ量を比較して、カウント
でやりました。久しぶりにAIを使わずに、自力で解けた気がする...
できれば関数定義もしたいのですが、それはゆっくりやればいいかな
参考文献
<?php
list($n, $q, $m) = explode(" ", trim(fgets(STDIN)));
$sRow = array_fill(0, $n+1, 0);
$s = array_fill(0, $n+1, $sRow);
// 敵の配列作成
for($i = 0; $i < $n; $i++) {
$enemy[$i] = explode(" ", trim(fgets(STDIN)));
}
// 正方形領域の座標取得、魔法範囲配列の作成
for($i = 0; $i < $q; $i++) {
// 座標取得
list($x1, $y1) = explode(" ",trim(fgets(STDIN)));
// 魔法発動座標
$x_a[] = $x1-1;
$y_a[] = $y1-1;
// 発動範囲
$s[$y_a[$i]][$x_a[$i]]++;
$s[$y_a[$i]+$m][$x_a[$i]]--;
$s[$y_a[$i]+$m][$x_a[$i]+$m]++;
$s[$y_a[$i]][$x_a[$i]+$m]--;
}
// 魔法を打ち終わった時点での総ダメージ量
// 横方向の累積和
for($i = 0; $i < $n+1; $i++) {
for($j = 1; $j < $n+1; $j++) {
$s[$i][$j] += $s[$i][$j-1];
}
}
// 縦方向の累積和
for($i = 1; $i < $n + 1; $i++) {
for($j = 0; $j < $n + 1; $j++) {
$s[$i][$j] += $s[$i - 1][$j];
}
}
// 倒した敵の数
$enemy_death = 0;
// 敵の体力と魔法のダメージを比較して、0以下になったら倒したので、カウント
for($i = 0; $i < $n; $i++) {
for($j = 0; $j < $n; $j++) {
if($enemy[$i][$j] - $s[$i][$j] <= 0) {
$enemy_death++;
}
}
}
echo $enemy_death;
?>