(OJ 寒假马拉松 第五场 E题)
从别人博客看到较精炼的解法
思路:
用一个三维向量记录人的身体朝向的信息——面朝的方向,身体竖直方向向上的方向,人左臂平伸的方向。
6种变换就是对这个向量的操作。(详见代码)
注意:题目是左手坐标系
另外可以参考这里,方法相同。
#include<iostream> #include<cstdio> using namespace std; int main(){ char s[10]; int t,n,x,y,z,fwd,left,tmp,dis,v; scanf("%d",&t); while(t--){ scanf("%d",&n); x=y=z=fwd=0; left=4;v=2; while(n--){ scanf("%s %d",s,&dis); if(s[0]=='b'){ fwd=(fwd+3)%6; left=(left+3)%6; } else if(s[0]=='l'){ tmp=fwd; fwd=left; left=(tmp+3)%6; } else if(s[0]=='r'){ tmp=left; left=fwd; fwd=(tmp+3)%6; } else if(s[0]=='u'){ tmp=fwd; fwd=v; v=(tmp+3)%6; } else if(s[0]=='d'){ tmp=v; v=fwd; fwd=(tmp+3)%6; } if(fwd==0) x+=dis; else if(fwd==1) y+=dis; else if(fwd==2) z+=dis; else if(fwd==3) x-=dis; else if(fwd==4) y-=dis; else z-=dis; } printf("%d %d %d %d\n",x,y,z,fwd); } return 0; }