paiza Aランクレベルアップメニュー 陣取りゲーム「STEP: 21 陣取りの手間 PHP編」 (ランク B 相当)

ひとつ前のSTEPからわずかに修正した形です。

$conをペーストする場所を間違えていて引っかかったりしました。
コピペは慎重に!ですね!

(ところでエラーが出たとき、行数だけみて
「なんだろなー」とつい見に行ってしまうのですが、
先生がそれではよくない、内容をちゃんと読む癖を、とおっしゃっていたので
調べたところ、
expects exactly 2 parameter, 1 given in …
つまり必要なパラメータが足りない。
パラメータの数がなにかおかしいんだなと気づいて見に行ったら
なるほどペーストを2度していました。)

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


    $s = explode(" ",trim(fgets(STDIN)));
    $h = $s[0];
    $w = $s[1];
    
    $con = 0;//reset カウント
    
    //map取得
    for ($i = 0; $i < $h; $i++) {
        $hoge = trim(fgets(STDIN));
        for ($j = 0; $j < $w; $j++) {
            $map[$i][$j] = mb_substr($hoge, $j, 1); 
            if($map[$i][$j]=="*"){
                $y = $i;
                $x = $j;
            }
        }
    }
    
    
    $map[$y][$x] = strval($con);//なぜかstr型でないと反映されない!
    $con++;
    //print_r($map);
    
    
    //初期処理
    //新たに*にした場所を$newstarに格納する
    
    if($y>=1 && $map[$y-1][$x]=="."){
        $map[$y-1][$x] =strval($con);
        $newstar[]=array($y-1,$x, $con);
    }
    if($y<$h-1 && $map[$y+1][$x]=="."){
        $map[$y+1][$x] = strval($con);
        $newstar[]=array($y+1,$x, $con);
    }
    if($x>=1 && $map[$y][$x-1]=="."){
        $map[$y][$x-1] = strval($con);
        $newstar[]=array($y,$x-1, $con);
    }
    if($x<$w-1 && $map[$y][$x+1]=="."){
        $map[$y][$x+1] = strval($con);
        $newstar[]=array($y,$x+1, $con);
    }
    
    //print_r($newstar);
    //echo($newstar[0][2]."\n");
    
    
    while(count($newstar)>=1){//移動可能な配列がある限り続ける
        
        $y = $newstar[0][0];
        $x = $newstar[0][1];
        $con = ($newstar[0][2])+1;
        
        //共通操作
        if($y>=1 && $map[$y-1][$x]=="."){
            $map[$y-1][$x] = strval($con); 
            $newstar[]=array($y-1,$x, $con);
        }
        if($y<$h-1 && $map[$y+1][$x]=="."){
            $map[$y+1][$x] = strval($con); 
            $newstar[]=array($y+1,$x, $con);
        }
        if($x>=1 && $map[$y][$x-1]=="."){
            $map[$y][$x-1] = strval($con); 
            $newstar[]=array($y,$x-1, $con);
        }
        if($x<$w-1 && $map[$y][$x+1]=="."){
            $map[$y][$x+1] = strval($con); 
            $newstar[]=array($y,$x+1, $con);
        }
        
        array_shift($newstar);//いまつかった配列を消す
        
    }
    
    //print_r($newstar);

    
    //出力
    for ($i = 0; $i < $h; $i++) {
        for ($j = 0; $j < $w; $j++) {
            echo($map[$i][$j]);
        }
        echo("\n");
    }


?>

ちょっとどう対応しようか考えて、
結局、配列$newstarに第3のパラメータをもたせました。
それが$con(カウント)になります。

この$conはint型な訳ですが、なぜかそのままではうまく出力できなかったので
strvalをかけ、必要な部分はstring型にしてあります。

kue

なお、最初に実行したとき引っかかって出力行も足りないという事態になったので、
ここで入力例を放り込んで確認したらエラーが出てました。
入力例2などでひっかかったらこれで試すのをお勧め。

https://paiza.io/ja/projects/new

paiza.io
kue

問題一覧はこちら
paizaAランクレベルアップメニュー(各言語あり)

https://paiza.jp/works/mondai/a_rank_level_up_problems
1+