paiza Bランクレベルアップメニュー「五目並べ PHP編」 Final問題 解答例

いままでのSTEPで「横」「縦」「斜め」の判定があるので
それを全部くっつければよいだろうと思いましたが、
同じ配列に追加したいので
カウンタ変数$conを追加しました。
原始的な方法でカウンターを増やしています。(横のぶんが終わったら+5するとか)

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!
    
    $h = 5;
    $w = 5;
    
    //マップ取得
    for ($i = 0; $i < $h; $i++) {
        $hoge = trim(fgets(STDIN));
        for ($j = 0; $j < $w; $j++) {
            $maps[$i][$j] = mb_substr($hoge, $j, 1);
        }
    }
    
    $con = 0;//reset 横・縦・斜めの列を順番に配列に格納するためのカウンタ
    
    //横一行を配列に格納
    for ($i = 0; $i < $h; $i++) {
        for ($j = 0; $j < $w; $j++) {
            $lines[$i][] = $maps[$i][$j] ;
        }
    }
    
    $con += 5;
   
    //縦一行を配列に格納
    for ($i = 0; $i < $w; $i++) {
        for ($j = 0, $k = $con; $j < $h; $j++,$k++) {
            $lines[$k][] = $maps[$i][$j] ;
        }

    }
    
    $con += 5;
    
    //y0,x0から右下へのななめの行を配列に格納
    for ($i = 0, $j=0; $i < $w; $i++, $j++) {
        $lines[$con][$i] = $maps[$i][$j] ;
    }
    
    $con++;
    
    //y0, x4から左下へのななめの行を配列に格納
    for ($i = 0, $j=$w-1 ; $i < $h; $i++,$j--) {
        $lines[$con][$i] = $maps[$i][$j] ;
    }
    
    //print_r($lines);
   
 
    //配列内の値の出現回数をカウント
    for ($i = 0; $i < count($lines); $i++) {
        $counts[$i] = array_count_values($lines[$i]);
    }
    //print_r($counts);
     
     
    $winner = "D"; //初期設定
    
    //判定
    for ($i = 0; $i < count($lines); $i++) {
        foreach($counts[$i] as $key => $value){
            //echo($key.",".$value."\n");
            if($value==5 && $key!="."){//もし5つ揃っていたら
                $winner = $key;
            }
        }
    }
    
    echo($winner."\n");

?>

個人的には斜めの判定の2本目(左上がりの斜め一列)の判定が一番頭を使いました。

ざっくりした構造としては、

  • 一列ごとに全部配列$linesに格納
  • 格納した配列(要素5つ)の値の出現回数をカウントし、それをさらに配列$countsに入れる
  • foreachで回して「出現回数が5であり、かつキーは「.」でない(すなわち○か×)」であるならキーを$winnerに格納
  • 出力

という流れです。

参考元: 配列の値の出現回数をカウント – array_count_values関数

https://webkaru.net/php/array-count-values/

この記事の問題はこちら
paiza Bランクレベルアップメニュー(PHP編)

https://paiza.jp/works/mondai/prob60/problem_index?language_uid=php
kue

なにとぞ追加をお願いします!

1+