【へび】FINAL問題 へび (paizaランク A 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【へび】FINAL問題 へび (paizaランク A 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
前回の問題が解ければ解けると思いますが、この問題で引っかかり易い間違いは「時刻が100になったら処理が終わる」ことです。方向転換後、時刻が100になるまで、またはへびの頭が伸ばせなくなるまでという処理が作れるかどうかが前回との相違点となります。
100歩以上処理したり1歩足りなかったりして最初間違えた(;^ω^)
解答例
|
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 |
<?php $input = explode(" ",trim(fgets(STDIN))); $row = $input[0]; //行数を取得する $col = $input[1]; //列数を取得する $sy = $input[2]; //初期位置のy座標を取得する $sx = $input[3]; //初期位置のx座標を取得する $num = $input[4]; //方向転換の回数を取得する $m =0; //向きを管理するカウンター $trunnum =0; //時刻を管理するカウンター for($i = 0;$i < $row;$i++){ $array[] = str_split(trim(fgets(STDIN))); //マップを取得する } $array[$sy][$sx] = "*"; //初期位置に”*”を入れる for($j = 0;$j < $num;$j++){ //方向転換する回数分処理(方向転換分歩く処理) $data = explode(" ",trim(fgets(STDIN))); $hosuu = $data[0]; //方向転換する時刻 $realhosuu = $hosuu - $trunnum; // 座標の変化分 $trunnum = $hosuu; //時刻の変化分 $trun = $data[1]; //方向転換する向き $end = false; //処理中断フラグ for($i = 0;$i < $realhosuu;$i++){ //方向転換する前分歩く処理 if($m == 0){ //北を向いている時 if($array[$sy - 1][$sx] != "."){ //一つ先の座標が「.」以外なら $end = true; //処理中断フラグに「true」を入れる break; } else { $sy--; //一歩進める $array[$sy][$sx] = "*"; //現在の位置に”*”を入れる } } elseif($m == 1){ //西を向いている時 if($array[$sy][$sx - 1] != "."){ //一つ先の座標が「.」以外なら $end = true; //処理中断フラグに「true」を入れる break; } else { $sx--; //一歩進める $array[$sy][$sx] = "*"; //現在の位置に”*”を入れる } } elseif($m == 2){ //東を向いている時 if($array[$sy][$sx + 1] != "."){ //一つ先の座標が「.」以外なら $end = true; //処理中断フラグに「true」を入れる break; } else { $sx++; //一歩進める $array[$sy][$sx] = "*"; //現在の位置に”*”を入れる } } elseif($m == 3){ //南を向いている時 if($array[$sy + 1][$sx] != "."){ //一つ先の座標が「.」以外なら $end = true; //処理中断フラグに「true」を入れる break; } else { $sy++; //一歩進める $array[$sy][$sx] = "*"; //現在の位置に”*”を入れる } } } if($end == true){ break; //処理中段フラグに「true」が入っているならば以降の処理を中断させる } if ($m == 0){ //北を向いている時 if($trun == "L"){ $m = 1; //西を向く } elseif($trun == "R"){ $m = 2; //東を向く } } elseif($m ==1){ //西を向いている時 if($trun == "L"){ $m = 3; //南を向く } elseif($trun == "R"){ $m = 0; //北を向く } } elseif($m ==2){ //東を向いている時 if($trun == "L"){ $m = 0; //北を向く } elseif($trun == "R"){ $m = 3; //南を向く } } elseif($m ==3){ //南を向いている時 if($trun == "L"){ $m = 2; //東を向く } elseif($trun == "R"){ $m = 1; //西を向く } } } $remaining = 100 - $trunnum; // 方向転換分歩き終わった後、時刻が100になるまで歩き続ける回数 if($end == false){ //処理中段フラグが「false」ならば for($i = 0;$i < $remaining;$i++){ if($m == 0){ //北を向いている時 if($array[$sy - 1][$sx] != "."){ //一つ先の座標が「.」以外なら $end = true; //処理中断フラグに「true」を入れる break; } else { $sy--; //一歩進める $array[$sy][$sx] = "*"; //現在の位置に”*”を入れる } } elseif($m == 1){ //西を向いている時 if($array[$sy][$sx - 1] != "."){ //一つ先の座標が「.」以外なら $end = true; //処理中断フラグに「true」を入れる break; } else { $sx--; //一歩進める $array[$sy][$sx] = "*"; //現在の位置に”*”を入れる } } elseif($m == 2){ //東を向いている時 if($array[$sy][$sx + 1] != "."){ //一つ先の座標が「.」以外なら $end = true; //処理中断フラグに「true」を入れる break; } else { $sx++; //一歩進める $array[$sy][$sx] = "*"; //現在の位置に”*”を入れる } } elseif($m == 3){ //南を向いている時 if($array[$sy + 1][$sx] != "."){ //一つ先の座標が「.」以外なら $end = true; //処理中断フラグに「true」を入れる break; } else { $sy++; //一歩進める $array[$sy][$sx] = "*"; //現在の位置に”*”を入れる } } } } for($i =0;$i < $row;$i++){ //マップを出力する for($j = 0;$j < $col;$j++){ echo $array[$i][$j]; } echo "\n"; } ?> |