paiza スキルチェック過去問セット「神経衰弱 PHP編」解答例

配列は0始まりになり、カード配置が1はじまりなのが悩みどころ。
もっとまともな方法がありそうなものですが、とりあえず通りました。

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

    /*
    1行目には3つの整数 H, W, Nが入力されます。
    H と W はそれぞれ並べられたトランプの縦方向の枚数と横方向の枚数で、N はプレイヤーの数を表します。
    
    続く H 行には、配置されたトランプに書かれた数字が入力されます。
    t_{i,j} は i 行 j 列に置かれたトランプに書かれた数字を表します。
    */
    
    //情報取得
    
    $s = explode(" ",trim(fgets(STDIN)));
    $h = $s[0];
    $w = $s[1];
    $num = $s[2];

    //カードの配置hogeを1はじまりにしたい
    for ($i = 1; $i <= $h; $i++) {
        $hoge[$i] = explode(" ",trim(fgets(STDIN)));
    }
    for ($i = 1; $i <= $h; $i++) {
        array_unshift($hoge[$i],"hoge");//0番目に意味のないhogeを追加して1始まりにする
    }

    //print_r($hoge);
    
    /*
    次の行には、記録の長さ L が与えられます。
    続く L 行には、捲られたトランプの記録が時系列順で与えられます。
    これは、a_i 行 b_i 列のトランプと A_i 行 B_i 列のトランプが捲られたことを表します。
    */
    
    $record_num = trim(fgets(STDIN));
    for ($i = 0; $i < $record_num; $i++) {
        $record[$i] = explode(" ",trim(fgets(STDIN)));//取得したレコードは1はじまり
    }
    //echo("record:");
    //print_r($record);
    
    //playerのとったカード数を格納するための配列
    for ($i = 1; $i <= $num; $i++) {
        $get_player_cards[$i] = 0; 
    }
    
    //print_r($get_player_cards);
    
    
    $now_player = 1;//reset 現在のプレーヤー
    
    for ($i = 0; $i < $record_num; $i++) {
        $set01h = $record[$i][0];
        $set01w = $record[$i][1];
        $set02h = $record[$i][2];
        $set02w = $record[$i][3];
        
        //echo("ただいまのターン ".$i."\n");
        //echo("選ばれたカード\n");
        //echo($hoge[$set01h][$set01w].",". $hoge[$set02h][$set02w]."\n");
        
        if($hoge[$set01h][$set01w] == $hoge[$set02h][$set02w]){
            //echo("一致した\n");
            unset($hoge[$set01h][$set01w]);//当たったカードを削除
            unset($hoge[$set02h][$set02w]);
            $get_player_cards[$now_player] += 2; //2まいげっと
            
            //print_r($hoge);
            
        }else{
            //echo("一致しなかった\n");
            //playerを移動
            $now_player++;
            if($now_player > $num){
                $now_player = 1;//reset
            }
            //echo("playerが移動しました ただいまのplyaer:".$now_player."\n");
        }
        
    }
    
    //print_r($get_player_cards);
    
    //出力
    foreach($get_player_cards as $value){
        echo($value."\n");
    }

?>

デバッグもいつもそのままコメントアウトだけして残してしまうのですが、
読みづらかったらすみません。
癖というか、デバッグがないと安心できないといいますか。。

途中でかませた変数、$set01h(1枚目の行)、$set01w(1枚目の列)なども
いっそなくして
普通に$record[$i][0]のままで記述した方が分かりやすかったかもですね。
変数の扱いもいつも悩みどころです。

Mr.Berry

paiza スキルチェック過去問セット(php)

https://paiza.jp/works/mondai/skillcheck_archive/problem_index?language_uid=php
0

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です