【へび】STEP: 5 幅のある移動 (paizaランク B 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【へび】STEP: 5 幅のある移動 (paizaランク B 相当)
※リンク先へ移動する為には「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 103 104 105 |
<?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; //向きを管理するカウンター $stopcounter = 0; for($i =0;$i < $row;$i++){ $array[$i] = str_split(trim(fgets(STDIN))); } $array[$sy][$sx] = "*"; //現在の位置を「*」にする for($i = 0;$i < $num;$i++){ $test = explode(" ",trim(fgets(STDIN))); $lr = $test[0]; //移動する向きL,Rを取得する $n = $test[1]; //移動歩数を取得する for($j = 0; $j < $n;$j++){ if($m == 0){ /*北を向いている時の処理*/ if($lr == "L" && $array[$sy][$sx - 1] == "."){ //左が移動可能の時の処理 $sx--; $array[$sy][$sx] = "*"; //現在の位置を「*」にする } elseif($lr == "R" && $array[$sy][$sx + 1] == ".") { //右が移動可能の時の処理 $sx++; $array[$sy][$sx] = "*"; //現在の位置を「*」にする } else { $stopcounter = 1; break; } } elseif($m == 1){ /*西を向いている時の処理*/ if($lr == "L" && $array[$sy + 1][$sx] == "."){ //左が移動可能の時の処理 $sy++; $array[$sy][$sx] = "*"; //現在の位置を「*」にする } elseif($lr == "R" && $array[$sy - 1][$sx] == ".") { //右が移動可能の時の処理 $sy--; $array[$sy][$sx] = "*"; //現在の位置を「*」にする } else { $stopcounter = 1; break; } } elseif($m == 2){ /*東を向いている時の処理*/ if($lr == "L" && $array[$sy - 1][$sx] == "."){ //左が移動可能の時の処理 $sy--; $array[$sy][$sx] = "*"; //現在の位置を「*」にする } elseif($lr == "R" && $array[$sy + 1][$sx] == ".") { //右が移動可能の時の処理 $sy++; $array[$sy][$sx] = "*"; //現在の位置を「*」にする } else { $stopcounter = 1; break; } } elseif($m == 3){ /*南を向いている時の処理*/ if($lr == "L" && $array[$sy][$sx + 1] == "."){ //左が移動可能の時の処理 $sx++; $array[$sy][$sx] = "*"; //現在の位置を「*」にする } elseif($lr == "R" && $array[$sy][$sx - 1] == ".") { //右が移動可能の時の処理 $sx--; $array[$sy][$sx] = "*"; //現在の位置を「*」にする } else { $stopcounter = 1; break; } } } if($stopcounter == 0){ //移動した後、向きを変える処理 if($m == 0){ if($lr == "L"){ $m = 1; } elseif($lr == "R"){ $m = 2; } } elseif ($m == 1){ if($lr == "L"){ $m = 3; } elseif($lr == "R"){ $m = 0; } } elseif($m == 2){ if($lr == "L"){ $m = 0; } elseif($lr == "R"){ $m = 3; } } elseif ($m == 3){ if($lr == "L"){ $m = 2; } elseif($lr == "R"){ $m = 1; } } } } foreach($array as $value){ //マップを出力する foreach($value as $item){ echo $item; } echo "\n"; } ?> |