【陣取りゲーム】STEP: 5 陣取りのターン数 (paizaランク B 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【陣取りゲーム】STEP: 5 陣取りのターン数 (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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?php $input = explode(" ",trim(fgets(STDIN))); $row = $input[0]; //マップの行数を取得する $col = $input[1]; //マップの列数を取得する $n = $input[2]; //距離の個数 $target_y = 0; //「*」のy座標を格納する変数 $target_x = 0; //「*」のx座標を格納する変数 for($i = 0;$i < $row;$i++){ $array[] = str_split(trim(fgets(STDIN))); //マップを取得し配列に格納する } $target_array = array(); //陣地の座標を記録する配列 $distance_array = array(); //距離を格納する配列 for($i = 0;$i < $row;$i++){ for($j = 0;$j < $col;$j++){ if($array[$i][$j] == "*"){ $array[$i][$j] = 0; //「*」を0に上書きする $target_array[0][] = $i; //「*」のy座標を取得し、「target_array」に保存する $target_array[0][] = $j; //「*」のx座標を取得し、「target_array」に保存する break; } } } for($i = 0;$i < $n;$i++){ $distance_array[] = trim(fgets(STDIN)); //距離の配列作成 } $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] = $array[$target_y][$target_x] + 1; //ターン数を上書きする $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] = $array[$target_y][$target_x] + 1; //ターン数を上書きする $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] = $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] = $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++){ $test1 = in_array($array[$i][$j] , $distance_array); //現座標の値が「$distance_array」に含まれているか調べる $test2 = is_numeric($array[$i][$j]); //現座標の値が数値かどうか調べる if($test1 == true && $test2 == true){ $array[$i][$j] = "?"; } elseif($test1 == false && $test2 == true) { $array[$i][$j] = "*"; } } } for($i = 0;$i < $row;$i++){ //マップを出力する for($j = 0;$j < $col;$j++){ echo $array[$i][$j]; } echo "\n"; } ?> |