close

題目概要:

1. 找出機器人移動後的位子和面向的方位。

2. R=右轉,L=左轉,F=向前走(以目前的方位走一步 Ex 現在面對北方則Y++,面向東方則X++,面向南方則Y--,面向西方則X--)。當前一個機器人摔下去前的位子需要紀錄,後來到此點的機器人會知道面沒有路,所以不會前進。

3. 機器人移動範圍0<=X<=50,0<=Y<=50 。

解題方向:

1. 自定義一個method判斷進行右轉或左轉後的方位。(也可以把此功能直接打main裡面,只是感覺有點亂)

2. 使用一個陣列紀錄機器人超出界線前的位子。

3. 判斷是不是"之前"有機器人超出界線or"目前"的機器人超出界外,再依情況輸出結果。

程式碼:

//Java
import java.util.Scanner;
import java.util.Arrays;
class uva118{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
int edgeX=sc.nextInt(); //邊界X。
int edgeY=sc.nextInt(); //邊界Y。
boolean array[][]=new boolean[51][51]; //紀錄之前是否有機器人掉落。
for(int i=0;i<51;i++) Arrays.fill(array[i],false);
while(sc.hasNextInt()){
int x=sc.nextInt(); //目前X座標。
int y=sc.nextInt(); //目前Y座標。
char position=sc.next().charAt(0); //目前面向方向。
String cmd=sc.next(); //指令
for(int i=0;i<cmd.length();i++){
if(cmd.charAt(i)=='F'){
int tempX=x,tempY=y;
//判斷座標是否加減
if(position=='N') tempY++;
else if(position=='S')tempY--;
else if(position=='W')tempX--;
else tempX++;
//判斷座標"之前"是否有機器人超出界線、"目前"的機器人是否超出界線。
if(tempX>edgeX || tempY>edgeY || tempX<0 || tempY<0){
//"之前"無機器人超出界線且"目前"機器人超出界線。
if(!array[x][y]){
array[x][y]=true;
//輸出答案(超出界線)。
System.out.println(x+" "+y+" "+position+" LOST");
break;
}
}else{
x=tempX;
y=tempY;
}
}else{
//查詢方向。
position=findP(position,cmd.charAt(i));
}
//當指令是最後一筆時即可輸出答案(無超出界線)。
if(i==cmd.length()-1) System.out.println(x+" "+y+" "+position);
}
}
}
//自定義查詢方向的method。
public static char findP(char p,char cmd){
switch(cmd){
case 'R':
switch(p){
case 'N':
p='E';
break;
case 'S':
p='W';
break;
case 'W':
p='N';
break;
case 'E':
p='S';
break;
}
break;
case 'L':
switch(p){
case 'N':
p='W';
break;
case 'S':
p='E';
break;
case 'W':
p='S';
break;
case 'E':
p='N';
break;
}
break;
}
return p;
}
}
view raw uva118.java hosted with ❤ by GitHub

arrow
arrow
    文章標籤
    Java
    全站熱搜
    創作者介紹
    創作者 a7069810 的頭像
    a7069810

    紀錄自己的程式人生

    a7069810 發表在 痞客邦 留言(0) 人氣()