PKU 1290 Grandpa's Rubik Cube

http://poj.org/problem?id=1290
ルービックキューブの初期状態と回転の指示が与えられる。
指示に従った時、揃っているかどうかを答えろというような問題

シミュレーション。
サンプルに全ての回転のパターンが出てこないのがちょっと怖かったのですが、AC

string in[6][3];

void input(){
  rep(i,3){
    in[4][i].clear();
    char c;
    rep(j,3){
      cin>>c;
      in[4][i]+=c;
    }
  }

  rep(i,3){
    rep(j,4){
      in[j][i]="";
      char c;
      rep(k,3){
        cin>>c;
        in[j][i]+=c;
      }
    }
  }

  rep(i,3){
    in[5][i].clear();
    char c;
    rep(j,3){
      cin>>c;
      in[5][i]+=c;
    }
  }  

}

int magic[][4][5]={
  {
    {4,0,0,1,0},
    {1,0,0,1,0},
    {5,0,0,1,0},
    {3,2,2,-1,0},
  },
  
  {
    {4,2,0,0,1},
    {2,0,0,1,0},
    {5,0,2,0,-1},
    {0,2,2,-1,0},
  },
  
  {
    {4,2,2,-1,0},
    {3,0,0,1,0},
    {5,2,2,-1,0},
    {1,2,2,-1,0},
  },
  
  {
    {4,0,2,0,-1},
    {0,0,0,1,0},
    {5,2,0,0,1},
    {2,2,2,-1,0},
  },
  
  {
    {3,0,2,0,-1},
    {2,0,2,0,-1},
    {1,0,2,0,-1},
    {0,0,2,0,-1},
  },

  {
    {1,2,0,0,1},
    {2,2,0,0,1},
    {3,2,0,0,1},
    {0,2,0,0,1},
  },
};

void rotate(int p){
  char tmp=in[p][0][0];
  in[p][0][0]=in[p][2][0];
  in[p][2][0]=in[p][2][2];
  in[p][2][2]=in[p][0][2];
  in[p][0][2]=tmp;

  tmp=in[p][0][1];
  in[p][0][1]=in[p][1][0];
  in[p][1][0]=in[p][2][1];
  in[p][2][1]=in[p][1][2];
  in[p][1][2]=tmp;

  rep(i,3){
    char *pp[4];
    rep(j,4){
      int* m=magic[p][j];
      pp[3-j] = &in[m[0]][m[1]+i*m[3]][m[2]+i*m[4]];
    }

    tmp=*pp[0];
    *pp[0]=*pp[1];
    *pp[1]=*pp[2];
    *pp[2]=*pp[3];
    *pp[3]=tmp;
  }
}

void solve(){
  input();
  /*
  rep(i,6)rep(j,3) cout<<in[i][j]<<endl;
  cout<<endl;
  */
  
  int p;
  while(cin>>p,p){
    rotate(abs(p)-1);
    if(p<0){
      rotate(abs(p)-1);
      rotate(abs(p)-1);
    }
    /*
    rep(i,6)rep(j,3) cout<<in[i][j]<<endl;
    cout<<endl;
    */
  }

  rep(i,6){
    bool ok=true;
    rep(j,3)rep(k,3) ok&=in[i][j][k]==in[i][0][0];
    if(!ok){
      cout<<"No, you are wrong!"<<endl;
      return;
    }
  }
  
  cout<<"Yes, grandpa!"<<endl;
}

main(){
  int n;
  cin>>n;
  rep(i,n) solve();
}