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