宇航员
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 6026 | Accepted: 2632 |
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
我可能要疯了
一个小错误找了一晚上!
但是有这个错误,样例居然可以过!
爆炸!!!!!!!
思路:
因为各个方向都有一个数字来表示,发现:每个相反的方向是有规律的!
left=(right+3)%6 不信的话大家可以自己试试
有了这个结论,那么我开三个自变量记录当前位置的前面,左面,上面
这是三维立体面,用一个自变量记录前面 是完全不够的
如,我虽然都面向0,但是我头可以朝上,也可以头朝下
然后判断完方向那么我就可以在相对的坐标轴上进行加减操作!
//用0 1 2 3 4 5 分别表示6个方向
#include<stdio.h>
char s[10];
int n,step,t;
int top=2,f=0,l=4;
int x=0,y=0,z=0;
void move(int step) //在坐标轴上进行加减操作
{
if(f==0)
x+=step;
if(f==1)
y+=step;
if(f==2)
z+=step;
if(f==3)
x-=step;
if(f==4)
y-=step;
if(f==5)
z-=step;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
top=2,f=0,l=4;
x=0,y=0,z=0;
scanf("%d",&n);
while(n--)
{
scanf("%s%d",s,&step);
if(s[0]=='l')
{
t=l;
l=(f+3)%6;
f=t;
move(step);
//printf("%d %d %d\n",f,l,top);
}
if(s[0]=='r')
{
t=l;
l=f;
f=(t+3)%6;
move(step);
//printf("%d %d %d\n",f,l,top);
}
if(s[0]=='u')
{
t=f;
f=top;
top=(t+3)%6;
move(step);
//printf("%d %d %d\n",f,l,top);
}
if(s[0]=='d')
{
t=f;
f=(top+3)%6;
top=t;
move(step);
//printf("%d %d %d\n",f,l,top);
}
if(s[0]=='f')
{
move(step);
//printf("%d %d %d\n",f,l,top);
}
if(s[0]=='b')
{
f=(f+3)%6;
l=(l+3)%6;
move(step);
//printf("%d %d %d\n",f,l,top);
}
}
printf("%d %d %d %d\n",x,y,z,f);
}
}