题意是一个可以在三维空间任意行走的宇航员,告诉你他每次行走的方向,让求最后到达的地点和面对的方向。这题看上去比较简单,但仔细想想,其实就算是朝一个方向走也有4种不同的方式,所以很容易想到不仅记录前进的方向还要记录头所朝的方向,然后根据转弯判断之后的方向。
#include<stdio.h>
#include<string.h>
char tmp[20];
void next(int flag,int dir[],int head[]) //枚举所有的向左向右的情形
{
if((dir[0]==head[1] && dir[0]) || (dir[1]+head[0]==0 && dir[1]))
{
dir[0]=0;
dir[1]=0;
dir[2]=flag;
}
else if((dir[0]+head[1]==0 && dir[0]) || (dir[1]==head[0] && dir[1]))
{
dir[0]=0;
dir[1]=0;
dir[2]=-flag;
}
else if((dir[1]==head[2] && dir[1]) || (dir[2]+head[1]==0 && dir[2]))
{
dir[0]=flag;
dir[1]=0;
dir[2]=0;
}
else if((dir[1]+head[2]==0 && dir[1]) || (dir[2]==head[1] && dir[2]))
{
dir[0]=-flag;
dir[1]=0;
dir[2]=0;
}
else if((dir[2]==head[0] && dir[2]) || (dir[0]+head[2]==0 && dir[0]))
{
dir[0]=0;
dir[1]=flag;
dir[2]=0;
}
else if((dir[2]+head[0]==0 && dir[2]) || (dir[0]==head[2] && dir[0]))
{
dir[0]=0;
dir[1]=-flag;
dir[2]=0;
}
}
int main()
{
int n,t,step,i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int dir[3]={1,0,0}; //前进的方向
int head[3]={0,0,1}; //头朝的方向
int site[3]={0,0,0}; //当前的位置
while(n--)
{
scanf("%s %d",tmp,&step);
if(strcmp(tmp,"left")==0)
next(1,dir,head);
if(strcmp(tmp,"right")==0)
next(-1,dir,head);
if(strcmp(tmp,"back")==0) //向后就是将方向调转
for(i=0;i<3;i++)
dir[i]=-dir[i];
if(strcmp(tmp,"up")==0) //向上就是面向之前头朝的方向,头朝之前面向的反方向
{
int x[3];
for(i=0;i<3;i++)
x[i]=head[i];
for(i=0;i<3;i++)
head[i]=-dir[i];
for(i=0;i<3;i++)
dir[i]=x[i];
}
if(strcmp(tmp,"down")==0) //向下就是面向之前头朝的反方向,头朝之前面向的方向
{
int x[3];
for(i=0;i<3;i++)
x[i]=head[i];
for(i=0;i<3;i++)
head[i]=dir[i];
for(i=0;i<3;i++)
dir[i]=-x[i];
}
for(i=0;i<3;i++)
site[i]+=step*dir[i];
}
printf("%d %d %d ",site[0],site[1],site[2]);
if(dir[0]>0) //最后面朝的方向
printf("0\n");
if(dir[1]>0)
printf("1\n");
if(dir[2]>0)
printf("2\n");
if(dir[0]<0)
printf("3\n");
if(dir[1]<0)
printf("4\n");
if(dir[2]<0)
printf("5\n");
}
return 0;
}