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