【いびつなリバーシ対戦】STEP: 6 いびつなひとりリバーシ(1ターン) (paizaランク B 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【いびつなリバーシ対戦】STEP: 6 いびつなひとりリバーシ(1ターン) (paizaランク B 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
「STEP:5」の問題にマップ上に障害物「#」が追加された問題です。石をいた地点から上下左右斜め上にこの障害物があった場合、探索を中断する処理を追加します。
解答例
|
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 |
<?php $input = explode(" ",trim(fgets(STDIN))); $row = $input[0]; //マップの行数を取得する $col = $input[1]; //マップの列数を取得する $flag = false; //「*」で挟んだ場合を管理するフラグ $n = 1; //石を置いた箇所から縦横を「*」に変える為に使用する変数 for($i = 0;$i < $row;$i++){ $array[] = str_split(trim(fgets(STDIN))); //マップを取得する } for($i = 0;$i < $row;$i++){ //「!」の探し出し、y座標を「$sy」、x座標を「$sx」に保存する for($j = 0;$j < $col;$j++){ if($array[$i][$j] == "!"){ $sy = $i; $sx = $j; break; } } } /*--------------------石を置いた箇所から縦列下方向を「*」に変える処理開始--------------*/ while(isset($array[$sy + $n][$sx])){ //石のを置いた位置から下方向に「*」があるか探索する if($array[$sy + $n][$sx] == "*"){ $flag = true; break; } elseif($array[$sy + $n][$sx] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ for($i = $n;$i > 0;$i--){ //「*」で挟んだ時、間を全て「*」にする $array[$sy + $i][$sx] = "*"; } } /*--------------------石を置いた箇所から縦列下方向を「*」に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から縦列上方向を「*」に変える処理開始--------------*/ while(isset($array[$sy - $n][$sx])){ //石のを置いた位置から上方向に「*」があるか探索する if($array[$sy - $n][$sx] == "*"){ $flag = true; break; } elseif($array[$sy - $n][$sx] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ for($i = $n;$i > 0;$i--){ //「*」で挟んだ時、間を全て「*」にする $array[$sy - $i][$sx] = "*"; } } /*--------------------石を置いた箇所から縦列下方向を「*」に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から横右方向を「*」に変える処理開始--------------*/ while(isset($array[$sy][$sx + $n])){ //石のを置いた位置から右方向に「*」があるか探索する if($array[$sy][$sx + $n] == "*"){ $flag = true; break; } elseif($array[$sy][$sx + $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ //「*」で挟んだ時、間を全て「*」にする for($i = $n;$i > 0;$i--){ $array[$sy][$sx + $i] = "*"; } } /*--------------------石を置いた箇所から横右方向を「*」に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から横左方向を「*」に変える処理開始--------------*/ while(isset($array[$sy][$sx - $n])){ //石のを置いた位置から左方向に「*」があるか探索する if($array[$sy][$sx - $n] == "*"){ $flag = true; break; } elseif ($array[$sy][$sx - $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ //「*」で挟んだ時、間を全て「*」にする for($i = $n;$i > 0;$i--){ $array[$sy][$sx - $i] = "*"; } } /*--------------------石を置いた箇所から横左方向を「*」に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から斜め右下方向を「*」に変える処理開始--------------*/ while(isset($array[$sy + $n][$sx + $n])){ //石のを置いた位置から斜め右下に「*」があるか探索する if($array[$sy + $n][$sx + $n] == "*"){ $flag = true; break; } elseif ($array[$sy + $n][$sx + $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ for($i = $n;$i > 0;$i--){ //「*」で挟んだ時、間を全て「*」にする $array[$sy + $i][$sx + $i] = "*"; } } /*--------------------石を置いた箇所から斜め右下方向を「*」に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から斜め右上方向を「*」に変える処理開始--------------*/ while(isset($array[$sy - $n][$sx + $n])){ //石のを置いた位置から斜め右上方向に「*」があるか探索する if($array[$sy - $n][$sx + $n] == "*"){ $flag = true; break; } elseif ($array[$sy - $n][$sx + $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ for($i = $n;$i > 0;$i--){ //「*」で挟んだ時、間を全て「*」にする $array[$sy - $i][$sx + $i] = "*"; } } /*--------------------石を置いた箇所から斜め右上方向を「*」に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から斜め左下方向を「*」に変える処理開始--------------*/ while(isset($array[$sy + $n][$sx - $n])){ //石のを置いた位置から斜め左下に「*」があるか探索する if($array[$sy + $n][$sx - $n] == "*"){ $flag = true; break; } elseif ($array[$sy + $n][$sx - $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ //「*」で挟んだ時、間を全て「*」にする for($i = $n;$i > 0;$i--){ $array[$sy + $i][$sx - $i] = "*"; } } /*--------------------石を置いた箇所から斜め左下方向を「*」に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 /*--------------------石を置いた箇所から斜め左上方向を「*」に変える処理開始--------------*/ while(isset($array[$sy - $n][$sx - $n])){ //石のを置いた位置から斜め左上方向に「*」があるか探索する if($array[$sy - $n][$sx - $n] == "*"){ $flag = true; break; } elseif ($array[$sy - $n][$sx - $n] == "#"){ //「#」に当たったら処理を中断する break; } else { $n++; } } if($flag == true){ //「*」で挟んだ時、間を全て「*」にする for($i = $n;$i > 0;$i--){ $array[$sy - $i][$sx - $i] = "*"; } } /*--------------------石を置いた箇所から斜め左上方向を「*」に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 $array[$sy][$sx] = "*"; //「!」を「*」に上書きする foreach($array as $value){ //マップを出力する foreach($value as $item){ echo $item; } echo "\n"; } ?> |
