【いびつなリバーシ対戦】STEP: 8 いびつなリバーシ対戦(2人) (paizaランク A 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【いびつなリバーシ対戦】STEP: 8 いびつなリバーシ対戦(2人) (paizaランク A 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
前回の操作の応用で解けます。石を表す「*」の文字列をターンプレイヤーである「A」か「B」で処理します。
解答例
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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
<?php $input = explode(" ",trim(fgets(STDIN))); $row = $input[0]; //マップの行数を取得する $col = $input[1]; //マップの列数を取得する $num = $input[2] * 2 ; //石を置く回数を取得する(2人分にするために×2を忘れずに) $flag = false; //「*」で挟んだ場合を管理するフラグ $n = 1; //石を置いた箇所から縦横を「*」に変える為に使用する変数 $player = "A"; //ターンプレイヤー for($i = 0;$i < $row;$i++){ $array[] = str_split(trim(fgets(STDIN))); //マップを取得する } for($z = 0;$z < $num;$z++){ $test = explode(" ",trim(fgets(STDIN))); //石を置く座標を取得 $sy = $test[0]; //石を置くy座標を取得する $sx = $test[1]; //石を置くx座標を取得する $array[$sy][$sx] = $player; //石を置く /*--------------------石を置いた箇所から縦列下方向にターンプレイヤーの石に変える処理開始--------------*/ while(isset($array[$sy + $n][$sx])){ //石のを置いた位置から下方向に「*」があるか探索する if($array[$sy + $n][$sx] == $player){ $flag = true; break; } elseif($array[$sy + $n][$sx] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ for($i = $n;$i > 0;$i--){ //ターンプレイヤーの石で挟んだ時、間を全て$playerにする $array[$sy + $i][$sx] = $player; } } /*--------------------石を置いた箇所から縦列下方向をターンプレイヤーの石に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から縦列上方向をターンプレイヤーの石に変える処理開始--------------*/ while(isset($array[$sy - $n][$sx])){ //石のを置いた位置から上方向に「*」があるか探索する if($array[$sy - $n][$sx] == $player){ $flag = true; break; } elseif($array[$sy - $n][$sx] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ for($i = $n;$i > 0;$i--){ //ターンプレイヤーの石で挟んだ時、間を全て$playerにする $array[$sy - $i][$sx] = $player; } } /*--------------------石を置いた箇所から縦列下方向をターンプレイヤーの石に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から横右方向をターンプレイヤーの石に変える処理開始--------------*/ while(isset($array[$sy][$sx + $n])){ //石のを置いた位置から右方向に「*」があるか探索する if($array[$sy][$sx + $n] == $player){ $flag = true; break; } elseif($array[$sy][$sx + $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ //ターンプレイヤーの石で挟んだ時、間を全て$playerにする for($i = $n;$i > 0;$i--){ $array[$sy][$sx + $i] = $player; } } /*--------------------石を置いた箇所から横右方向をターンプレイヤーの石に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から横左方向をターンプレイヤーの石に変える処理開始--------------*/ while(isset($array[$sy][$sx - $n])){ //石のを置いた位置から左方向に「*」があるか探索する if($array[$sy][$sx - $n] == $player){ $flag = true; break; } elseif ($array[$sy][$sx - $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ //ターンプレイヤーの石で挟んだ時、間を全て$playerにする for($i = $n;$i > 0;$i--){ $array[$sy][$sx - $i] = $player; } } /*--------------------石を置いた箇所から横左方向をターンプレイヤーの石に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から斜め右下方向をターンプレイヤーの石に変える処理開始--------------*/ while(isset($array[$sy + $n][$sx + $n])){ //石のを置いた位置から斜め右下に「*」があるか探索する if($array[$sy + $n][$sx + $n] == $player){ $flag = true; break; } elseif ($array[$sy + $n][$sx + $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ for($i = $n;$i > 0;$i--){ //ターンプレイヤーの石で挟んだ時、間を全て$playerにする $array[$sy + $i][$sx + $i] = $player; } } /*--------------------石を置いた箇所から斜め右下方向をターンプレイヤーの石に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から斜め右上方向をターンプレイヤーの石に変える処理開始--------------*/ while(isset($array[$sy - $n][$sx + $n])){ //石のを置いた位置から斜め右上方向に「*」があるか探索する if($array[$sy - $n][$sx + $n] == $player){ $flag = true; break; } elseif ($array[$sy - $n][$sx + $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ for($i = $n;$i > 0;$i--){ //ターンプレイヤーの石で挟んだ時、間を全て$playerにする $array[$sy - $i][$sx + $i] = $player; } } /*--------------------石を置いた箇所から斜め右上方向をターンプレイヤーの石に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から斜め左下方向を「*」に変える処理開始--------------*/ while(isset($array[$sy + $n][$sx - $n])){ //石のを置いた位置から斜め左下に「*」があるか探索する if($array[$sy + $n][$sx - $n] == $player){ $flag = true; break; } elseif ($array[$sy + $n][$sx - $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ //ターンプレイヤーの石で挟んだ時、間を全て$playerにする for($i = $n;$i > 0;$i--){ $array[$sy + $i][$sx - $i] = $player; } } /*--------------------石を置いた箇所から斜め左下方向をターンプレイヤーの石に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から斜め左上方向をターンプレイヤーの石に変える処理開始--------------*/ while(isset($array[$sy - $n][$sx - $n])){ //石のを置いた位置から斜め左上方向に「*」があるか探索する if($array[$sy - $n][$sx - $n] == $player){ $flag = true; break; } elseif ($array[$sy - $n][$sx - $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ //ターンプレイヤーの石で挟んだ時、間を全て$playerにする for($i = $n;$i > 0;$i--){ $array[$sy - $i][$sx - $i] = $player; } } /*--------------------石を置いた箇所から斜め左上方向をターンプレイヤーの石に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 if($player == "A"){ //ターンプレイヤーを切り替える $player = "B"; } elseif ($player == "B"){ $player = "A"; } } foreach($array as $value){ //マップを出力する foreach($value as $item){ echo $item; } echo "\n"; } ?> |
