LoginSignup
0
0

【2 次元上のいもす法の練習問題】 練習問題 (paizaランク C 相当)

Posted at

問題

解答

うっす。:raised_hand::cow:
今回の問題はかなり楽しくできました。RPGゲームとかの範囲攻撃はこんな感じで作られてんのかな。

大まかな流れとしては

  1. 敵の配列作成
  2. 魔法範囲を作成
  3. 総ダメージ量の配列作成
  4. 敵の体力と総ダメージ量を比較して、カウント

でやりました。久しぶりに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;

?>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0