(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;
}