这是一道三维空间的模拟题,解题的关键在于如何确定宇航员当前所处的方向状态。通过题目,用心点我们不难发现其方向改变有一定的规律可循。
x、y、z轴的正半轴方向可以用0 1 2来表示。
x、y、z轴的负半轴方向可用3 4 5 来表示。
最好自己能在草稿纸画一下,这样下面的推理便一目了然了!
在这里我们大可只用三个变量便可确定当前宇航员的状态:p left top 用来表示宇航员的面朝方向、左边方向以及顶部方向。所有方向形成了一个环状,前与后、左与右、上与下的关系可表示如下(如若还是不理解,大可自己模拟一下):(p+3)%6 (left+3)%6 (top+3)%6.
当然其他方向也要随之改变。xx、yy、zz分别对应各轴,定义一个 move(step) 函数,对应方向累加输入的步数,最后输出xx,yy,zz的值即可!
宇航员
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 5190 | Accepted: 2198 |
Description
问题描述:
宇航员在太空中迷失了方向,在他的起始位置现在建立一个虚拟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米。
其中向上和向下如下图所示:
宇航员在太空中迷失了方向,在他的起始位置现在建立一个虚拟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米。
其中向上和向下如下图所示:
Input
第一行一个正整数m,表示测试数据的组数。每组测试数据第一行是一个正整数n(1<=n<=10000)表示宇航员行走的次数,下面n行每行输入一次相对行走,格式如上所述,其中( 1 <= x <= 10000 为正整数)。
Output
对于每组输入数据输出一行,x y z p, 中间用空格隔开,x y z是宇航员的位置的绝对坐标,p是宇航员面向的绝对方向编号(0<=p <=5)。
Sample Input
1 6 left 10 right 11 up 12 down 13 forward 14 back 15
Sample Output
23 -10 12 3
#include<iostream>
#include<string>
using namespace std;
int p,xx,yy,zz;
void multi(int x){
switch(p){
case 0:{
xx+=x;
break;
}
case 1:{
yy+=x;
break;
}
case 2:{
zz+=x;
break;
}
case 3:{
xx+=-x;
break;
}
case 4:{
yy+=-x;
break;
}
case 5:{
zz+=-x;
break;
}
}
}
int main(){
int t,step,up,left,n,m;
string move;
cin>>n;
while(n--){
xx=yy=zz=0;
p=0,up=2,left=4;
cin>>m;
while(m--){
cin>>move>>step;
if(move=="forward") {//向前走不用改变任何方向,面朝的方向轴加上对应的值就好
multi(step);
}
else if(move=="back") { //如果是向后转,改变其面朝方向与左边方向
p=(p+3)%6;
left=(left+3)%6;
multi(step);
}
else if(move=="left"){ //左转改变其左转方向并且左边方向对应改变
t=p;
p=left;
left=(t+3)%6;
multi(step);
}
else if(move=="right"){//右转与左转大同小异,原来的面朝方向变为左边方向
t=p;
p=(left+3)%6;
left=t;
multi(step);
}
else if(move=="up"){//改变其上下方向
t=p;
p=up;
up=(t+3)%6;
multi(step);
}
else if(move=="down"){
t=p;
p=(up+3)%6;
up=t;
multi(step);
}
}
cout<<xx<<" "<<yy<<" "<<zz<<" "<<p<<endl;
}
return 0;
}