注意 当宇航员面相z轴时,如果向上是头所对的方向,例如,如果宇航员现在面相z轴的正半轴(2)向上,则是x 的负半轴(3);如果打表的话要注意,宇航员的头可能会倒过来
有一个公式 坐标轴的方向 0,1,2,3,4,5,; 可得到(n+3)%6 即为 n 的反方向,只需设三个参数,dir,(脸所对方向) lfdir(左脸说对方想),h(头所对方向)
一开始 dir=0,h=2 lfdir=4
注意: 向左,向右,向前,向后,头的方向不变,向上,向下,左脸的方向不变
#include <iostream>
#include <string.h>
using namespace std;
char a[10];
int dir,dis;
int x,y,z;
void solve(int dir,int dis)
{
if(dir==0)
x+=dis;
else if(dir==3) x-=dis;
else if(dir==1) y+=dis;
else if(dir==4) y-=dis;
else if(dir==2) z+=dis;
else z-=dis;
}
int main()
{
int i,t,n,h,lf,tem;
cin>>t;
while(t--)
{
cin>>n;
dir=0;
h=2;
lf=4;
x=0;
y=0;
z=0;
for(i=0;i<n;i++)
{
cin>>a>>dis;
switch(a[0])
{
case 'f': break;//向前走的时候脸,左脸,头的方向不变
case 'b': //向后 脸,和左脸的方向与原来的方向相反 可以用公式
dir=(dir+3)%6;
lf=(lf+3)%6;
break;
case 'l': //向左转之后,脸的方向与原来左脸的方向相反,左脸的方向与原来脸的方向相同
tem=dir;
dir=lf;
lf=(tem+3)%6;
break;
case 'r':
tem=dir;
dir=(lf+3)%6;
lf=tem;
break;
case 'u'://向上的时候脸的方向与原来头的方向相同,头的方向与原来脸的方向相反
tem=dir;
dir=h;
h=(tem+3)%6;
break;
case 'd':
tem=dir;
dir=(h+3)%6;
h=tem;
break;
}
solve(dir,dis);
}
cout<<x<<" "<<y<<" "<<z<<" "<<dir<<endl;
}
return 0;
}
772

被折叠的 条评论
为什么被折叠?



