【陣取りゲーム】FINAL問題 陣取りゲーム (paizaランク A 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【陣取りゲーム】FINAL問題 陣取りゲーム (paizaランク A 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
一気に難しくなったような気がする(;^ω^)
AとBが交互に陣取りをしていく問題ですが、1ターン中に何か所陣地を広げればいいかの制御が難しかった。
一回躓くと泥沼に引きづりこまれる問題だった…。
解説とかもできる気がしないので、コードから読み取ってもらえるとry
解答例
|
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
<?php $input = explode(" ",trim(fgets(STDIN))); $row = $input[0]; //マップの行数を取得する $col = $input[1]; //マップの列数を取得する $trun = trim(fgets(STDIN)); //ターンプレイヤーを取得する $a_flag = true; //Aの次のターンを管理するフラグ $b_flag = true; //Bの次のターンを管理するフラグ for($i = 0;$i < $row;$i++){ $array[] = str_split(trim(fgets(STDIN))); //マップを取得し配列に格納する } $a_target_array = array(); //Aの陣地の座標を記録する配列 $b_target_array = array(); //Bの陣地の座標を記録する配列 for($i = 0;$i < $row;$i++){ for($j = 0;$j < $col;$j++){ if($array[$i][$j] == "A"){ $a_target_array[0][] = $i;//「A」のy座標を取得し、「target_array」に保存する $a_target_array[0][] = $j;//「A」のx座標を取得し、「target_array」に保存する } if($array[$i][$j] == "B"){ $b_target_array[0][] = $i;//「B」のy座標を取得し、「target_array」に保存する $b_target_array[0][] = $j;//「B」のx座標を取得し、「target_array」に保存する } } } $a_queue = 0; //Aが陣地を広げるqueue番号 $b_queue = 0; //Bが陣地を広げるqueue番号 $a_turn = 0; //Aが1ターン中に処理するqueue番号 $b_turn = 0; //Bが1ターン中に処理するqueue番号 while($a_flag == true || $b_flag == true){ if($trun == "A"){ //Aのターン $a_flag = false; $a_count = count($a_target_array); //要素数をカウントする for($i = $a_turn;$i < $a_count;$i++){ $target_y = $a_target_array[$i][0]; //Aの陣地を広げるqueue番のy座標を取り出す $target_x = $a_target_array[$i][1]; //Aの陣地を広げるqueue番のx座標を取り出す if($array[$target_y + 1][$target_x] == "."){ //陣地を広げる中心座標の上が「.」なら $array[$target_y + 1][$target_x] = "A"; //"A"を上書きする $a_queue++; //$queueを1上げる $a_flag = true; //次のターン処理を行うフラグ $a_target_array[$a_queue][] = $target_y + 1; //広げた陣地のy座標を記録する $a_target_array[$a_queue][] = $target_x; //広げた陣地のx座標を記録する } if($array[$target_y - 1][$target_x] == "."){ //陣地を広げる中心座標の下が「.」なら $array[$target_y - 1][$target_x] = "A"; //"A"を上書きする $a_queue++; //$queueを1上げる $a_flag = true; //次のターン処理を行うフラグ $a_target_array[$a_queue][] = $target_y - 1; //広げた陣地のy座標を記録する $a_target_array[$a_queue][] = $target_x; //広げた陣地のx座標を記録する } if($array[$target_y][$target_x + 1] == "."){ //陣地を広げる中心座標の右が「.」なら $array[$target_y][$target_x + 1] = "A"; //"A"を上書きする $a_queue++; //$queueを1上げる $a_flag = true; //次のターン処理を行うフラグ $a_target_array[$a_queue][] = $target_y; //広げた陣地のy座標を記録する $a_target_array[$a_queue][] = $target_x + 1; //広げた陣地のx座標を記録する } if($array[$target_y][$target_x - 1] == "."){ //陣地を広げる中心座標の左が「.」なら $array[$target_y][$target_x - 1] = "A"; //"A"を上書きする $a_queue++; //$queueを1上げる $a_flag = true; //次のターン処理を行うフラグ $a_target_array[$a_queue][] = $target_y; //広げた陣地のy座標を記録する $a_target_array[$a_queue][] = $target_x - 1; //広げた陣地のx座標を記録する } } $a_turn = $i; $trun = "B"; } elseif($trun == "B"){ //Bのターン $b_flag = false; $b_count = count($b_target_array); //要素数をカウントする for($i = $b_turn;$i < $b_count;$i++){ $target_y = $b_target_array[$i][0]; //Bの陣地を広げるqueue番のy座標を取り出す $target_x = $b_target_array[$i][1]; //Bの陣地を広げるqueue番のx座標を取り出す if($array[$target_y + 1][$target_x] == "."){ //陣地を広げる中心座標の上が「.」なら $array[$target_y + 1][$target_x] = "B"; //"A"を上書きする $b_queue++; //$queueを1上げる $b_flag = true; //次のターン処理を行うフラグ $b_target_array[$b_queue][] = $target_y + 1; //広げた陣地のy座標を記録する $b_target_array[$b_queue][] = $target_x; //広げた陣地のx座標を記録する } if($array[$target_y - 1][$target_x] == "."){ //陣地を広げる中心座標の下が「.」なら $array[$target_y - 1][$target_x] = "B"; //"B"を上書きする $b_queue++; //$queueを1上げる $b_flag = true; //次のターン処理を行うフラグ $b_target_array[$b_queue][] = $target_y - 1; //広げた陣地のy座標を記録する $b_target_array[$b_queue][] = $target_x; //広げた陣地のx座標を記録する } if($array[$target_y][$target_x + 1] == "."){ //陣地を広げる中心座標の右が「.」なら $array[$target_y][$target_x + 1] = "B"; //"B"を上書きする $b_queue++; //$queueを1上げる $b_flag = true; //次のターン処理を行うフラグ $b_target_array[$b_queue][] = $target_y; //広げた陣地のy座標を記録する $b_target_array[$b_queue][] = $target_x + 1; //広げた陣地のx座標を記録する } if($array[$target_y][$target_x - 1] == "."){ //陣地を広げる中心座標の左が「.」なら $array[$target_y][$target_x - 1] = "B"; //"B"を上書きする $b_queue++; //$queueを1上げる $b_flag = true; //次のターン処理を行うフラグ $b_target_array[$b_queue][] = $target_y; //広げた陣地のy座標を記録する $b_target_array[$b_queue][] = $target_x - 1; //広げた陣地のx座標を記録する } } $b_turn = $i; $trun = "A"; } } $a_counter = 0; $b_counter = 0; for($i = 0;$i < $row;$i++){ //A、Bのカウント for($j = 0;$j < $col;$j++){ if($array[$i][$j] == "A"){ $a_counter++; } elseif ($array[$i][$j] == "B"){ $b_counter++; } } } echo $a_counter." ".$b_counter."\n"; if($a_counter > $b_counter){ echo "A"; } elseif ($a_counter < $b_counter){ echo "B"; } ?> |
