paiza Aランクレベルアップメニュー STEP28 「リバーシの操作 PHP編」解答例

通りましたが、どうもこのコードには何か不備がある予感がします。ほんのご参考まで。

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!
    
    //・ 出力する盤面の行数 H ,列数 W と石を置くマスの y , x 座標である Y , X が与えられます。
    
    $s = explode(" ",trim(fgets(STDIN)));
    
    $h = $s[0];
    $w = $s[1];
    $y = $s[2];
    $x = $s[3];

    for ($i = 0; $i < $h; $i++) {
        $hoge = trim(fgets(STDIN));
        for ($j = 0; $j < $w; $j++) {
            $maps[$i][$j] = mb_substr($hoge, $j,1);
        }
    }
    
    $maps[$y][$x] ="*";
    
    //xより右に石があるだろうか?
    for ($i = $x+1; $i < $w; $i++) {
        //echo("i ".$i."\n");
        if($maps[$y][$i]=="*"){
            //右に石がある
            //echo("右に石発見、座標はy x".$y.",".$i."\n");
            for($j = $x; $j<$i; $j++){//$j<=$iを修正
                //echo("here"."\n");
                $maps[$y][$j]="*";
            }
            break;//見つけたらそれ以上探索しない
        }
    }
    //xより左に石があるだろうか?
    for ($i = $x-1; $i >= 0; $i--) {
        if($maps[$y][$i]=="*"){
            //左に石がある
            for($j = $x; $j>=$i; $j--){
                //echo("here"."\n");
                $maps[$y][$j]="*";
            }
            break;
        }
        
    }
    //yより下に石があるだろうか?
    for ($i = $y+1; $i < $h; $i++) {
        if($maps[$i][$x]=="*"){
            //下に石がある
            for($j = $y; $j<=$i; $j++){
                $maps[$j][$x]="*";
            }
            break;
            
        }
        
    }
    
    //yより上に石があるだろうか?
    for ($i = $y-1; $i >= 0; $i--) {
        if($maps[$i][$x]=="*"){
            //上に石がある
            for($j = $y; $j>=$i; $j--){
                $maps[$j][$x]="*";
            }
            break;
        }
    }
    
    //---------------------------------------------
    //斜めの操作
    //---------------------------------------------
    
     //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");
    }

?>
0