百练OJ:1835:宇航员

题目链接:1835:宇航员

描述

问题描述:
  宇航员在太空中迷失了方向,在他的起始位置现在建立一个虚拟xyz坐标系,称为绝对坐标系,宇航员正面的方向为x轴正方向,头顶方向为z轴正方向,则宇航员的初始状态如下图所示:
百练OJ:1835:宇航员_第1张图片

现对六个方向分别标号,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米。
其中向上和向下如下图所示:
百练OJ:1835:宇航员_第2张图片
输入 第一行一个正整数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

题目解析:这道题要完成的是对人的行动进行一个模拟,对于宇航员的描述可以分为五个要素(x,y,z)位置的三个数,宇航员的头顶方向定义为:head,宇航员的正面朝向定义为:face。每次移动都是先对head和face的操作之后再移动, forward 不需要改变head/face,back的head不变,face掉转一下即可,通过数字的关系得出:face=(face+3)%6 ;对于left/right转向时候,head不变,face的改变直接用二维数组存起来。对于up,face变成head,head就变成了face的反向。对于down,head变成face方向,face变成head的反方向,不过在编程时,要注意要把要先更改的变量存储起来。

方向更改之后,在face方向上进行增加。最终对于相对的两个方向进行相减,得出最终位置。

题目代码:java

package com.kyc;

import java.util.Scanner;

public class Main_1835 {
	public static void main(String[] args) {
		Scanner input =new Scanner (System.in);
		int [][]  l={{6,5,1,6,2,4},
					 {2,6,3,5,6,0},
					 {4,0,6,1,3,6},
					 {6,2,4,6,5,1},
					 {5,6,0,2,6,3},
					 {1,3,6,4,0,6}};
		int m=input.nextInt();
		while (m>0){
			int head=2,face=0;
			int [] faces={0,0,0,0,0,0};
			int n=input.nextInt();
			while (n>0){
				n=n-1;
				String dirc=input.next();
				int num=input.nextInt();
			
				switch(dirc){
					case "forward":break;
					case "back":face=(face+3)%6;break;
					case "left":face=l[head][face];break;
					case "right":face=l[face][head];break;
					case "up":
						int tem_face=face;
				        face=head;
				        head=(tem_face+3)%6;
				        break;
					case "down":
						int tem_face2=face;
			            face=(head+3)%6;
			            head=tem_face2;
			            break;
				}
				faces[face]+=num;		
			}
				        
			m=m-1;
			int x=faces[0]-faces[3];
			int y=faces[1]-faces[4];
			int z=faces[2]-faces[5];
			System.out.println(x+" "+y+" "+z+" "+face);

		}
	}
}
解题代码:python

l=((6,5,1,6,2,4),
   (2,6,3,5,6,0),
   (4,0,6,1,3,6),
   (6,2,4,6,5,1),
   (5,6,0,2,6,3),
   (1,3,6,4,0,6))
m=int(input())
while m>0:
    head=2
    face=0
    faces=[0,0,0,0,0,0]
    n=int(input())
    while n>0:
        n=n-1
        str=input().split()
        dirc=str[0]
        num=int(str[1])
        if dirc=='forward':
            c=1
        elif dirc=='back':
            face=(face+3)%6
        elif dirc=='left':
            face=l[head][face]
        elif dirc=='right':
            face=l[face][head]
        elif dirc=='up':
            tem_face=face
            face=head
            head=(tem_face+3)%6
        else :
            tem_face=face
            face=(head+3)%6
            head=tem_face
        faces[face]+=num
    m=m-1
    x=faces[0]-faces[3]
    y=faces[1]-faces[4]
    z=faces[2]-faces[5]
    print (x,y,z,face)


你可能感兴趣的:(百练OJ与leetcode)