【陣取りゲーム】STEP: 3 陣取りの結末 (paizaランク B 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【陣取りゲーム】STEP: 3 陣取りの結末 (paizaランク B 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
個人的にこの問題をボンバーマンと呼んでたりします(‘ω’)
なかなか難しい問題だと思いました。陣地を広げていくうえで、広げる順番にも気を付けなければなりません。
解答例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<?php $input = explode(" ",trim(fgets(STDIN))); $row = $input[0]; //マップの行数を取得する $col = $input[1]; //マップの列数を取得する $target_y = 0; //「*」のy座標を格納する変数 $target_x = 0; //「*」のx座標を格納する変数 for($i = 0;$i < $row;$i++){ $array[] = str_split(trim(fgets(STDIN))); //マップを取得し配列に格納する } $target_array = array(); for($i = 0;$i < $row;$i++){ for($j = 0;$j < $col;$j++){ if($array[$i][$j] == "*"){ $target_array[0][] = $i; //「*」のy座標を取得し、「target_array」に保存する $target_array[0][] = $j; //「*」のx座標を取得し、「target_array」に保存する break; } } } //print_r($target_array); $queue = 0; //陣地を広げるqueue番号 for($i = 0;$i < count($target_array);$i++){ //「$target_array」の(queueが存在する)数まで繰り返す $target_y = $target_array[$i][0]; //陣地を広げるqueue番のy座標を取り出す $target_x = $target_array[$i][1]; //陣地を広げるqueue番のx座標を取り出す if($array[$target_y + 1][$target_x] == "."){ //陣地を広げる中心座標の上が「.」なら $array[$target_y + 1][$target_x] = "*"; //「*」に上書きする $queue++; //$queueを1上げる $target_array[$queue][] = $target_y + 1; //広げた陣地のy座標を記録する $target_array[$queue][] = $target_x; //広げた陣地のx座標を記録する } if($array[$target_y - 1][$target_x] == "."){ //陣地を広げる中心座標の下が「.」なら $array[$target_y - 1][$target_x] = "*"; //「*」に上書きする $queue++; //$queueを1上げる $target_array[$queue][] = $target_y - 1; //広げた陣地のy座標を記録する $target_array[$queue][] = $target_x; //広げた陣地のx座標を記録する } if($array[$target_y][$target_x + 1] == "."){ //陣地を広げる中心座標の右が「.」なら $array[$target_y][$target_x + 1] = "*"; //「*」に上書きする $queue++; //$queueを1上げる $target_array[$queue][] = $target_y; //広げた陣地のy座標を記録する $target_array[$queue][] = $target_x + 1; //広げた陣地のx座標を記録する } if($array[$target_y][$target_x - 1] == "."){ //陣地を広げる中心座標の左が「.」なら $array[$target_y][$target_x - 1] = "*"; //「*」に上書きする $queue++; //$queueを1上げる $target_array[$queue][] = $target_y; //広げた陣地のy座標を記録する $target_array[$queue][] = $target_x - 1; //広げた陣地のx座標を記録する } } for($i = 0;$i < $row;$i++){ //マップを出力する for($j = 0;$j < $col;$j++){ echo $array[$i][$j]; } echo "\n"; } ?> |
