hとwを$iと$jに対応させるとき、時々「あれ、どっちだったかな」とちょっと考えてしまいます。
1回それで間違えて途中でとまりました。やれやれです。
ご参考になれば。

<?php
// 自分の得意な言語で
// Let's チャレンジ!!
//・ 1 行目では、盤面の行数 H , 列数 W が与えられます。
//・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、 S
//_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。(0 ≦ j < W)
$s = explode(" ",trim(fgets(STDIN)));
$h = $s[0];
$w = $s[1];
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;
}
}
}
//print_r($map);
//echo($x.",".$y."\n");
//処理
if($y>0){
$map[$y-1][$x]="*";
}
if($y<$h){
$map[$y+1][$x]="*";
}
if($x>0){
$map[$y][$x-1]="*";
}
if($y<$w){
$map[$y][$x+1]="*";
}
//出力
for ($i = 0; $i < $h; $i++) {
for ($j = 0; $j < $w; $j++) {
echo($map[$i][$j]);
}
echo("\n");
}
?>

食べたデータが*だったらその座標を記録しておき、その上下左右を*に変える(範囲内なら)という構造です。
0