首页 > 专题系列 > Java解POJ > POJ 1835 宇航员 [解题报告] Java
2013
11-10

POJ 1835 宇航员 [解题报告] Java

宇航员

问题描述 :

问题描述:

  宇航员在太空中迷失了方向,在他的起始位置现在建立一个虚拟xyz坐标系,称为绝对坐标系,宇航员正面的方向为x轴正方向,头顶方向为z轴正方向,则宇航员的初始状态如下图所示:



现对六个方向分别标号,x,y,z正方向分别为0,1,2,负方向分别为3,4,5;称它们为绝对方向。宇航员在宇宙中只沿着与绝对坐标系xyz轴平行的方向行走,但是他不知道自己当前绝对坐标和自己面向的绝对方向。

任务描述:

  请根据宇航员对自己在相对方向上移动的描述确定宇航员最终的绝对坐标和面向的绝对方向。对在相对方向上移动的描述及意义如下:

forward x  向前走x米。

back x 先转向后,再走x米。

left x 先转向左,再走x米。

right x 先转向右,再走x米。

up x 先面向上,再走x米。

down x 先面向下,再走x米。

其中向上和向下如下图所示:

输入:

第一行一个正整数m,表示测试数据的组数。每组测试数据第一行是一个正整数n(1<=n<=10000)表示宇航员行走的次数,下面n行每行输入一次相对行走,格式如上所述,其中( 1 <= x <= 10000 为正整数)。

输出:

对于每组输入数据输出一行,x y z p, 中间用空格隔开,x y z是宇航员的位置的绝对坐标,p是宇航员面向的绝对方向编号(0<=p <=5)。

样例输入:

1
6
left 10
right 11
up 12
down 13
forward 14
back 15

样例输出:

23 -10 12 3

解题代码:

//* @author popop0p0popo
import java.util.*;
import java.io.*;

public class Main{
	public static int x,y,z,p,h;
	public static void main(String[] args){
	 Scanner scanner=new Scanner(new BufferedReader(new InputStreamReader(System.in)));
		int n=scanner.nextInt();
		int m,s;
		String f;
		for (int i=0;i< n ;i++ ){
			m=scanner.nextInt();
			x=y=z=p=0;
			h=2;
			for (int j=0;j< m ;j++ ){
				f=scanner.next();
				s=scanner.nextInt();
				if (f.equals("forward")){
					forward(s);
				}
				else if (f.equals("back")){
					turnLeft();
					turnLeft();
					forward(s);
				}
				else if (f.equals("left")){
					turnLeft();
					forward(s);
				}
				else if (f.equals("right")){
					turnLeft();
					turnLeft();
					turnLeft();
					forward(s);
				}
				else if (f.equals("up")){
					turnUp();
					forward(s);
				}
				else if (f.equals("down")){
					turnUp();
					turnUp();
					turnUp();
					forward(s);
				}
			}
			System.out.println(x+" "+y+" "+z+" "+p);
		}
	}

	public static void turnLeft(){
		if (h==0){
			if (p==2){
				p=1;
			}
			else if (p==1){
				p=5;
			}
			else if (p==5){
				p=4;
			}
			else if (p==4){
				p=2;
			}
		}
		else if (h==3){
			if (p==2){
				p=4;
			}
			else if (p==1){
				p=2;
			}
			else if (p==5){
				p=1;
			}
			else if (p==4){
				p=5;
			}
		}
		else if (h==2){
			if (p==0){
				p=4;
			}
			else if (p==4){
				p=3;
			}
			else if (p==3){
				p=1;
			}
			else if (p==1){
				p=0;
			}
		}
		else if (h==5){
			if (p==0){
				p=1;
			}
			else if (p==4){
				p=0;
			}
			else if (p==3){
				p=4;
			}
			else if (p==1){
				p=3;
			}
		}
		else if (h==1){
			if (p==3){
				p=5;
			}
			else if (p==5){
				p=0;
			}
			else if (p==0){
				p=2;
			}
			else if (p==2){
				p=3;
			}
		}
		else if (h==4){
			if (p==3){
				p=2;
			}
			else if (p==5){
				p=3;
			}
			else if (p==0){
				p=5;
			}
			else if (p==2){
				p=0;
			}
		}
	}

	public static void turnUp(){
		int t=h;
		turnLeft();
		turnLeft();
		h=p;
		p=t;
	}

	public static void forward(int s){
		switch (p){
			case 0:
				x=x+s;
			break;
			case 1:
				y=y+s;
			break;
			case 2:
				z=z+s;
			break;
			case 3:
				x=x-s;
			break;
			case 4:
				y=y-s;
			break;
			case 5:
				z=z-s;
			break;
		
		}
	}
}

  1. 换句话说,A[k/2-1]不可能大于两数组合并之后的第k小值,所以我们可以将其抛弃。
    应该是,不可能小于合并后的第K小值吧