【へび】STEP: 4 移動が可能かの判定・幅のある移動 (paizaランク B 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【へび】STEP: 4 移動が可能かの判定・幅のある移動 (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 |
<?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))); //マップを取得する } //print_r($array); 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--; } elseif($lr == "R" && $array[$sy][$sx + 1] == ".") { //右が移動可能な時の処理 $sx++; } else { //ストップする時の処理 $stopcounter = 1; echo $sy." ".$sx."\n"; echo "Stop"; break; } } elseif ($m == 1){ /*西を向いている時*/ if($lr == "L" && $array[$sy + 1][$sx] == "."){ //左が移動可能な時の処理 $sy++; } elseif ($lr == "R" && $array[$sy - 1][$sx] == ".") { //右が移動可能な時の処理 $sy--; } else { //ストップする時の処理 $stopcounter = 1; echo $sy." ".$sx."\n"; echo "Stop"; break; } } elseif ($m == 2){ /*東を向いている時*/ if($lr == "L" && $array[$sy - 1][$sx] == "."){ //左が移動可能な時の処理 $sy--; } elseif($lr == "R" && $array[$sy + 1][$sx] == ".") { //右が移動可能な時の処理 $sy++; } else { //ストップする時の処理 $stopcounter = 1; echo $sy." ".$sx."\n"; echo "Stop"; break; } } elseif ($m == 3){ /*南を向いている時*/ if($lr == "L" && $array[$sy][$sx + 1] == "."){ //左が移動可能な時の処理 $sx++; } elseif($lr == "R" && $array[$sy][$sx - 1] == ".") { //右が移動可能な時の処理 $sx--; } else { //ストップする時の処理 $stopcounter = 1; echo $sy." ".$sx."\n"; echo "Stop"; break; } } } if($stopcounter == 0){ //ストっプしなかった場合、向きを返る処理 echo $sy." ".$sx."\n"; 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; } } } else { break; } } ?> |
