- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <memory>
- #include <cstdlib>
- using namespace std;
- int cnt=0;
- enum E_Turn{
- E_NULL,
- E_VR,
- E_VL,
- E_SN,
- E_SF,
- E_HT,
- E_HB,
- };
- class Cube{
- private:
- char Data[24];
- vector < int > WayToGet;
- void BasicTurn(char &a,char &b,char &c,char &d){
- char tmp;
- tmp = a;
- a=b;
- b=c;
- c=d;
- d=tmp;
- return;
- }
- void VR(){
- BasicTurn(Data[15], Data[11], Data[7], Data[3]);
- BasicTurn(Data[12], Data[8], Data[4], Data[0]);
- BasicTurn(Data[21], Data[22], Data[23], Data[20]);
- }
- void VL(){
- BasicTurn(Data[14], Data[10], Data[6], Data[2]);
- BasicTurn(Data[13], Data[9], Data[5], Data[1]);
- BasicTurn(Data[16], Data[19], Data[18], Data[17]);
- }
- void HB(){
- BasicTurn(Data[14], Data[18], Data[4], Data[22]);
- BasicTurn(Data[15], Data[19], Data[5], Data[23]);
- BasicTurn(Data[8], Data[9], Data[10], Data[11]);
- }
- void HT(){
- BasicTurn(Data[12], Data[16], Data[6], Data[20]);
- BasicTurn(Data[13], Data[17], Data[7], Data[21]);
- BasicTurn(Data[2], Data[1], Data[0], Data[3]);
- }
- void SN(){
- BasicTurn(Data[22], Data[9], Data[16], Data[3]);
- BasicTurn(Data[21], Data[8], Data[19], Data[2]);
- BasicTurn(Data[15], Data[14], Data[13], Data[12]);
- }
- void SF(){
- BasicTurn(Data[23], Data[10], Data[17], Data[0]);
- BasicTurn(Data[20], Data[11], Data[18], Data[1]);
- BasicTurn(Data[7], Data[6], Data[5], Data[4]);
- }
- public:
- //E_Turn LastRotate;
- Cube(){
- for (int i=0; i<4; i++){
- Data[i]='G';
- Data[i+4]='O';
- Data[i+8]='U';
- Data[i+12]='R';
- Data[i+16]='B';
- Data[i+20]='Y';
- }
- WayToGet.resize(0);
- }
- Cube( char STR[24]){
- for (int i=0; i<24; i++){
- Data[i]=STR[i];
- }
- WayToGet.resize(0);
- }
- void PrintCube(){
- printf("\n\t%c %c\n", Data[1], Data[0]);
- printf("\t%c %c\n", Data[2], Data[3]);
- printf(" %c %c %c %c %c %c\n", Data[17], Data[16], Data[13], Data[12], Data[21], Data[20]);
- printf(" %c %c %c %c %c %c\n", Data[18], Data[19], Data[14], Data[15], Data[22], Data[23]);
- printf("\t%c %c\n", Data[9], Data[8]);
- printf("\t%c %c\n", Data[10], Data[11]);
- printf("\t%c %c\n", Data[5], Data[4]);
- printf("\t%c %c\n", Data[6], Data[7]);
- }
- void PrintWay(){
- //printf("\n");
- for (int i=0; i<WayToGet.size(); i++){
- if (WayToGet[i]==1)
- printf("VR ");
- if (WayToGet[i]==2)
- printf("VL ");
- if (WayToGet[i]==3)
- printf("SN ");
- if (WayToGet[i]==4)
- printf("SF ");
- if (WayToGet[i]==5)
- printf("HT ");
- if (WayToGet[i]==6)
- printf("HB ");
- }
- //printf("\n");
- }
- void PrintInvertedWay(){
- for (int i = WayToGet.size()-1; i>=0; i--){
- if (WayToGet[i]==1)
- printf("VR VR VR ");
- if (WayToGet[i]==2)
- printf("VL VL VL ");
- if (WayToGet[i]==3)
- printf("SN SN SN ");
- if (WayToGet[i]==4)
- printf("SF SF SF ");
- if (WayToGet[i]==5)
- printf("HT HT HT ");
- if (WayToGet[i]==6)
- printf("HB HB HB ");
- }
- }
- bool operator <(const Cube &B) const{
- for (int i=0; i<24; i++){
- if(Data[i]!=B.Data[i])
- return (Data[i]<B.Data[i]);
- }
- return false;
- }
- Cube Turn(E_Turn Flag){
- if (Flag==E_VR){
- (*this).VR();
- (this->WayToGet).push_back(E_VR);
- return *this;
- }
- if (Flag==E_VL){
- (*this).VL();
- (this->WayToGet).push_back(E_VL);
- return *this;
- }
- if (Flag==E_SN){
- (*this).SN();
- (this->WayToGet).push_back(E_SN);
- return *this;
- }
- if (Flag==E_SF){
- (*this).SF();
- (this->WayToGet).push_back(E_SF);
- return *this;
- }
- if (Flag==E_HT){
- (*this).HT();
- (this->WayToGet).push_back(E_HT);
- return *this;
- }
- if (Flag==E_HB){
- (*this).HB();
- (this->WayToGet).push_back(E_HB);
- return *this;
- }
- }
- };
- void WriteAnswer(const int flag, Cube T1, Cube T2){
- if (flag){
- printf("\n");
- T1.PrintWay();
- T2.PrintInvertedWay();
- }
- else {
- printf("\n");
- T2.PrintWay();
- T1.PrintInvertedWay();
- }
- }
- void AddAllRotation(Cube Curr, vector <Cube> &V){
- for (int i = 1; i<7; i++){
- V.push_back(Curr.Turn((E_Turn)i));
- }
- }
- void AddStepOfBFS(vector <Cube> &V, int &i_begin, int &i_end){
- for(; i_begin <= i_end; i_begin++)
- AddAllRotation(V[i_begin], V);
- i_begin++;
- i_end=V.size()-1;
- }
- int Find(Cube Curr, vector <Cube> &V){
- for (int i = 0; i<V.size(); i++)
- if (!((Curr < V[i]) || (V[i] < Curr)))
- return i;
- return -1;
- }
- void ComparingStepOfBFS(vector <Cube> &V1, vector <Cube> &V2,const int i_begin,const int i_end, const int flag){
- int index;
- for(int i = i_begin; i <= i_end; i++){
- index = Find(V1[i], V2);
- if ( index != -1){
- WriteAnswer( flag, V1[i], V2[index]);
- exit(0);
- }
- }
- }
- void DoubleBFS( vector <Cube> &V1, vector <Cube> &V2){
- int i1 = 0;
- int i2 = 0;
- int j1 = 0;
- int j2 = 0;
- for(int i=0; i < 40; i++){
- AddStepOfBFS(V1, i1, i2);
- ComparingStepOfBFS(V1, V2, i1, i2, true);
- AddStepOfBFS(V2, j1, j2);
- ComparingStepOfBFS(V2, V1, j1, j2, false);
- }
- exit(2);
- };
- int main(){
- char DataIn[24];
- for (int i=0; i<24; i++){
- cin >> DataIn[i];
- }
- Cube Desorded(DataIn);
- Cube Orded;
- vector <Cube> V1;
- vector <Cube> V2;
- V1.push_back(Desorded);
- V2.push_back(Orded);
- DoubleBFS(V1,V2);
- }