PKU 1835 宇航员
http://poj.org/problem?id=1835
3次元空間上での移動をシミュレーションしろというような問題。
面倒くさい系の問題かと思ったけれど、進行方向と上向きのベクトルさえ持っておけば、そこまできつい場合分けにはなりませんでした。
ただ、cin使ったらTLEしました。
typedef struct _vec{ int el[3]; }vec; char in[30]; main(){ int T; scanf("%d",&T); while(T--){ vec up={0,0,1},forward={1,0,0}; int n; scanf("%d",&n); vec pos={0,0,0}; rep(i,n){ int x; scanf(" %s %d",in,&x); vec tt; vec right; switch(in[0]){ case 'f': rep(i,3)pos.el[i]+=x*forward.el[i]; break; case 'b': rep(i,3)pos.el[i]-=x*forward.el[i]; rep(i,3)forward.el[i]*=-1; break; case 'u': rep(i,3)pos.el[i]+=x*up.el[i]; tt=up; rep(i,3)up.el[i]=-forward.el[i]; forward=tt; break; case 'd': rep(i,3)pos.el[i]-=x*up.el[i]; tt=up; rep(i,3)up.el[i]=forward.el[i]; rep(i,3)forward.el[i]=-tt.el[i]; break; case 'r': rep(i,3)right.el[i]=up.el[(i+1)%3]*forward.el[(i+2)%3]-up.el[(i+2)%3]*forward.el[(i+1)%3]; rep(i,3)pos.el[i]+=right.el[i]*x; rep(i,3)forward.el[i]=right.el[i]; break; case 'l': rep(i,3)right.el[i]=up.el[(i+1)%3]*forward.el[(i+2)%3]-up.el[(i+2)%3]*forward.el[(i+1)%3]; rep(i,3)pos.el[i]-=right.el[i]*x; rep(i,3)forward.el[i]=-right.el[i]; break; } } rep(i,3)printf("%d ",pos.el[i]); rep(i,3)if(forward.el[i])printf("%d\n",(3-3*forward.el[i])/2+i); } }