【いびつなリバーシ対戦】STEP: 2 リバーシの操作(縦横) (paizaランク C 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【いびつなリバーシ対戦】STEP: 2 リバーシの操作(縦横) (paizaランク C 相当)
※リンク先へ移動する為には「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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
<?php $input = explode(" ",trim(fgets(STDIN))); $row = $input[0]; //マップの行数を取得する $col = $input[1]; //マップの列数を取得する $sy = $input[2]; //石を置くy座標を取得する $sx = $input[3]; //石を置くx座標を取得する $flag = false; //「*」で挟んだ場合を管理するフラグ $n = 1; //石を置いた箇所から縦横を「*」に変える為に使用する変数 for($i = 0;$i < $row;$i++){ $array[] = str_split(trim(fgets(STDIN))); //マップを取得する } $array[$sy][$sx] = "*"; //石を置く /*--------------------石を置いた箇所から縦列下方向を「*」に変える処理開始--------------*/ while(isset($array[$sy + $n][$sx])){ //石のを置いた位置から下方向に「*」があるか探索する if($array[$sy + $n][$sx] == "*"){ $flag = true; 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; } 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; } 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; } else { $n++; } } if($flag == true){ //「*」で挟んだ時、間を全て「*」にする for($i = $n;$i > 0;$i--){ $array[$sy][$sx - $i] = "*"; } } /*--------------------石を置いた箇所から横左方向を「*」に変える処理修了--------------*/ $flag = false; //フラグの初期化 $n = 1; //変数の初期化 foreach($array as $value){ //マップを出力する foreach($value as $item){ echo $item; } echo "\n"; } ?> |
