题目链接:1835:宇航员
描述
问题描述: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)