paiza Aランクレベルアップメニュー STEP27「リバーシの操作(斜め) PHP編」

通りはしたけど。

入力例4で謎の引っかかり方をして
ハテナと思いつつ変なところを直したら通りはしたけど、
これを直して通ること自体が解せない。

一応自分のためにコードを置いておきます。
何か見落としがある気がしてならない。
ほんのご参考までに。たぶん何かが違うはずです。

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!
    
 /*   
・ 1行目では、盤面の行数 H ,列数 W , 石を置くマスの y , x 座標 である Y , X が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、
S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。
*/

    $s = explode(" ",trim(fgets(STDIN)));
    $h = $s[0];
    $w = $s[1];
    $y = $s[2];
    $x = $s[3];
    
    //echo "hello = ".$s[0]." , world = ".$s[1].$s[2]." , world = ".$s[3]."\n";
    
    //マップ取得
    for ($i = 0; $i < $h; $i++) {
        $hoge = trim(fgets(STDIN));
        for ($j = 0; $j < $w; $j++) {
            $maps[$i][$j] = mb_substr($hoge,$j,1);
            
            if($i == $y && $j == $x){
                 $maps[$i][$j] = "*";
            }
        }
    }
    
    //xより右下に石があるだろうか?
    if($x+2 <$w && $y+2 <$h){
        for ($i = $y+2; $i < $h; $i++) {
            for ($j = $x+2; $j < $w; $j++) {
            
                if($maps[$i][$j]=="*"){
                    //右下に石がある
                    //echo("右下に石発見、座標はy x".$j.",".$i."\n");
                    
                    for($k=$y, $m=$x; $k<=$i; $k++,$m++){//ここを$k<$iを$k<=$iに直したらstep4が通ったがそのこと自体がおかしい
                        
                        $maps[$k][$m]="*";
                    }
                    break 2;
                }
            }
        }
    }
    
    //xより右上に石があるだろうか?
    if($x+2 <$w && $y-2 >= 0){//「<=」が必須
        for ($i = $y-2; $i >= 0; $i--) {
            for ($j = $x+2; $j < $w; $j++) {
            
                if($maps[$i][$j]=="*"){
                    //右上に石がある
                    //echo("右上に石発見、座標はy x".$j.",".$i."\n");
                    
                    for($k=$y, $m=$x; $k>$i; $k--,$m++){
                        
                        $maps[$k][$m]="*";
                    }
                    break 2;
                }
            }
        }
    }

    //xより左上に石があるだろうか?
    if($x-2 >= 0 && $y-2 >= 0){
        //echo("here\n");
        for ($i = $y-2; $i >=0 ; $i--) {
            for ($j = $x-2; $j >=0; $j--) {
                //echo("yx ".$y.",".$x."\n");
            
                if($maps[$i][$j]=="*"){
                    //左上に石がある
                    //echo("左上に石発見、座標はy x".$j.",".$i."\n");
                    
                    for($k=$i, $m=$j; $k<$y; $k++,$m++){
                        
                        $maps[$k][$m]="*";
                    }
                    break 2;
                    
                }
            }
        }
    }
    
        
    //xより左下に石があるだろうか?
    if($x-2 >= 0 && $y+2 <= $h){//$y+2 <= $h の =はいるかいらないか??
        //echo("here\n");
        for ($i = $y+2; $i < $h ; $i++) { //なぜかここは $i <= $h とできない
            for ($j = $x-2; $j >=0; $j--) {
                //echo("yx ".$y.",".$x."\n");
            
                if($maps[$i][$j]=="*"){
                    //左上に石がある
                    //echo("左上に石発見、座標はy x".$j.",".$i."\n");
                    
                    for($k=$y, $m=$x; $k<$i; $k++,$m--){
                        
                        $maps[$k][$m]="*";
                    }
                    break 2;
                    
                }
            }
        }
    }

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

?>

$i,$jは探索結果として「石のあった」場所のはずです。つまりそこ自体はすでに石のはず。

その座標も含めて新規に石にしないといけないという設定がおかしい。
つまり、それ以前で何かがおかしいはずですが・・・

左の「本来そうなるはずの結果」に比べて、右の「入力例4の出力結果」は黄色の部分が抜けています。それでイコールを入れたら埋まって通ったのですが、なにかおかしいです。

まいったな。

まあいいや、先に進めばあらが分かるはずです。
とりあえず自戒もこめて置いておきましょう。

あぶらぼうず
当惑のあぶらぼうず

この記事の問題があるページはこちら

paiza Aランクレベルアップメニュー php編

https://paiza.jp/works/mondai/a_rank_level_up_problems/problem_index?language_uid=php
1+