【へび】STEP: 3 移動が可能かの判定・複数回の移動 (paizaランク B 相当) 解答例 – PHP編【Aランクレベルアップメニュー】
【Aランクレベルアップメニュー】 > 【へび】STEP: 3 移動が可能かの判定・複数回の移動 (paizaランク B 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
前回の問題に移動回数が追加され、その中で移動できない場合は「Stop」と出力し、処理を中断させる問題です。
解答例
|
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 |
<?php $input = explode(" ",trim(fgets(STDIN))); $row = $input[0]; //行数を取得 $col = $input[1]; //列数を取得 $sy = $input[2]; //y座標の初期位置を取得 $sx = $input[3]; //x座標の初期位置を取得 $movenum = $input[4]; //移動回数を取得する for($i = 0;$i < $row;$i++){ $array[$i] = str_split(trim(fgets(STDIN))); //マップを取得する } $m = 0; //向きを管理するカウンター for($i = 0;$i < $movenum;$i++){ $test = trim(fgets(STDIN)); //移動する向きを取得 if($m == 0){ /*北を向いている時*/ if($test == "L" && $array[$sy][$sx - 1] == "."){ //左が移動可能なら $sx--; echo $sy." ".$sx."\n"; $m = 1; /*西を向く*/ } elseif($test == "R" && $array[$sy][$sx + 1] == ".") { //右が移動可能なら $sx++; echo $sy." ".$sx."\n"; $m = 2; /*東を向く*/ } else { echo "Stop"; //移動ができないのなら「Stop」を出力する break; } } elseif($m == 1){ /*西を向いている時*/ if($test == "L" && $array[$sy+1][$sx] == "."){ //左が移動可能なら $sy++; echo $sy." ".$sx."\n"; $m = 3; /*南を向く*/ } elseif($test == "R" && $array[$sy-1][$sx] == ".") { //右が移動可能なら $sy--; echo $sy." ".$sx."\n"; $m = 0; /*北を向く*/ } else { echo "Stop"; //移動ができないのなら「Stop」を出力する break; } } elseif($m == 2){ /*東を向いている解き*/ if($test == "L" && $array[$sy-1][$sx] == "."){ //左が移動可能なら $sy--; echo $sy." ".$sx."\n"; $m = 0; /*北を向く*/ } elseif($test == "R" && $array[$sy+1][$sx] == ".") { //右が移動可能なら $sy++; echo $sy." ".$sx."\n"; $m = 3; /*南を向く*/ } else { echo "Stop"; //移動ができないのなら「Stop」を出力する break; } } elseif($m == 3){ /*南を向いている時*/ if($test == "L" && $array[$sy][$sx+1] == "."){ //左が移動可能なら $sx++; echo $sy." ".$sx."\n"; $m = 2; /*東を向く*/ } elseif($test == "R" && $array[$sy][$sx-1] == ".") { //右が移動可能なら $sx--; echo $sy." ".$sx."\n"; $m = 1; /*西を向く*/ } else { echo "Stop"; //移動ができないのなら「Stop」を出力する break; } } } ?> |