對一個復原魔方進行操作,記錄操作後魔方狀態

下面爲爲阿里巴巴的一道筆試題

一個三階魔方由六個面組成,顏色分別是白色(W),對面爲黃色(Y),紅色(R),對面爲橙色(O),綠色(G)對面爲藍色(B)。如果手持魔方,白色向上,紅色朝向自己,則綠色在左手側。                        
該程序對一個處於還原狀態的魔方進行操作,打印操作後的魔方狀態。操着指令爲單個指令組成的字符串。單個操作指令包括:
1. U:白色棉順時針旋轉90度
2. D:黃色面順時針旋轉90度
3. F:紅色面順時針旋轉90度
4. B:橙色面順時針旋轉90度
5. L:綠色面順時針旋轉90度
6. R:藍色面順時針旋轉90度
其中順時針旋轉定義爲將該面朝向自己的順時針方向。
按WYROGB順序輸出經過操作後6個面的狀態。每個面首先輸出中行塊顏色,然後從此面面向自己時的左下角開始,順時針順出每塊的顏色。輸出一面後換行。請設計一個數據結構表示魔方,並給予該數據結構完成功能。

本人用C++代碼代碼實現。具體如下:

包括的頭文件

#include "stdafx.h"
#include <string>
#include <iostream>

結構體

總共六個面,每個面有九個格每個格子從編號如下:

0|1|2
3|4|5
6|7|8
struct mofang_status{
    std::string face_f[9];//front面,紅色面
    std::string face_l[9];//left面,綠色面
    std::string face_r[9];//right面,藍色面
    std::string face_u[9];//up面,白色面
    std::string face_d[9];//down面,黃色面
    std::string face_b[9];//back面,橙色面
};

操作

U 白麪順時針旋轉90度

變動包括兩部分:
1 與U面直接相連四個面的三個格順時針替換。
2 U面本身瞬時針移動。

  • front(R)的i號位被被right的i(B)號位代替
  • right的i(B)號位被back的i號位代替(O)
  • back(O)的i號位被left(G)的i號位代替
  • left(G)的i號位被front(R)的i號位代替
  • up(W)面的位置順時針轉動一圈變成:
    6|3|0
    7|4|1
    8|5|2
void  U_function(mofang_status &status){
    std::string temp;
    for (int i =0;i<3;i++)
    {
        temp=status.face_f[i];
        status.face_f[i]=status.face_r[i];
        status.face_r[i]=status.face_b[i];
        status.face_b[i]=status.face_l[i];
        status.face_l[i]=temp;
    }
    temp = status.face_u[0];
    status.face_u[0]=status.face_u[6];
    status.face_u[6]=status.face_u[8];
    status.face_u[8]=status.face_u[2];
    status.face_u[2]=temp;
    temp = status.face_u[1];
    status.face_u[1]=status.face_u[3];
    status.face_u[3]=status.face_u[7];
    status.face_u[7]=status.face_u[5];
    status.face_u[5]=temp;
}

D黃面順時針旋轉90度

void  D_function(mofang_status &status){
    std::string temp;
    for (int i = 6;i < 9;i++)
    {
        temp=status.face_f[i];
        status.face_f[i]=status.face_l[i];
        status.face_l[i]=status.face_b[i];
        status.face_b[i]=status.face_r[i];
        status.face_r[i]=temp;
    }
    temp = status.face_d[0];
    status.face_d[0]=status.face_d[6];
    status.face_d[6]=status.face_d[8];
    status.face_d[8]=status.face_d[2];
    status.face_d[2]=temp;
    temp = status.face_d[1];
    status.face_d[1]=status.face_d[3];
    status.face_d[3]=status.face_d[7];
    status.face_d[7]=status.face_d[5];
    status.face_d[5]=temp;
}

F紅面順時針旋轉90度

void  F_function(mofang_status &status){
    std::string temp;
    for (int i = 6;i < 9;i++)
    {
        temp=status.face_u[i];
        status.face_u[i]=status.face_l[i];
        status.face_l[i]=status.face_d[i];
        status.face_d[i]=status.face_r[i];
        status.face_r[i]=temp;
    }
    temp = status.face_f[0];
    status.face_f[0]=status.face_f[6];
    status.face_f[6]=status.face_f[8];
    status.face_f[8]=status.face_f[2];
    status.face_f[2]=temp;
    temp = status.face_f[1];
    status.face_f[1]=status.face_f[3];
    status.face_f[3]=status.face_f[7];
    status.face_f[7]=status.face_f[5];
    status.face_f[5]=temp;
}

B橙面順時針旋轉90度

void  B_function(mofang_status &status){
    std::string temp;
    for (int i = 0;i < 3;i++)
    {
        temp=status.face_u[i];
        status.face_u[i]=status.face_r[i];
        status.face_r[i]=status.face_d[i];
        status.face_d[i]=status.face_l[i];
        status.face_l[i]=temp;
    }
    temp = status.face_b[0];
    status.face_b[0]=status.face_b[6];
    status.face_b[6]=status.face_b[8];
    status.face_b[8]=status.face_b[2];
    status.face_b[2]=temp;
    temp = status.face_b[1];
    status.face_b[1]=status.face_b[3];
    status.face_b[3]=status.face_b[7];
    status.face_b[7]=status.face_b[5];
    status.face_b[5]=temp;
}

L綠面順時針旋轉90度

void  L_function(mofang_status &status){
    std::string temp;
    for (int i = 0;i < 8;i+=3)
    {
        temp=status.face_f[i];
        status.face_f[i]=status.face_u[i];
        status.face_u[i]=status.face_b[i];
        status.face_b[i]=status.face_d[i];
        status.face_d[i]=temp;
    }
    temp = status.face_l[0];
    status.face_l[0]=status.face_l[6];
    status.face_l[6]=status.face_l[8];
    status.face_l[8]=status.face_l[2];
    status.face_l[2]=temp;
    temp = status.face_l[1];
    status.face_l[1]=status.face_l[3];
    status.face_l[3]=status.face_l[7];
    status.face_l[7]=status.face_l[5];
    status.face_l[5]=temp;
}

R藍面順時針旋轉90度

void  R_function(mofang_status &status){
    std::string temp;
    for (int i = 2;i < 9;i+=3)
    {
        temp=status.face_f[i];
        status.face_f[i]=status.face_d[i];
        status.face_d[i]=status.face_b[i];
        status.face_b[i]=status.face_u[i];
        status.face_u[i]=temp;
    }
    temp = status.face_r[0];
    status.face_r[0]=status.face_r[6];
    status.face_r[6]=status.face_r[8];
    status.face_r[8]=status.face_r[2];
    status.face_r[2]=temp;
    temp = status.face_r[1];
    status.face_r[1]=status.face_r[3];
    status.face_r[3]=status.face_r[7];
    status.face_r[7]=status.face_r[5];
    status.face_r[5]=temp;
}

測試函數

int _tmain(int argc, _TCHAR* argv[])
{
    /*設置初始狀態*/
    mofang_status status_now;
    for (int i =0;i<9;i++)
    {
        status_now.face_f[i]="R";
        status_now.face_u[i]="W";
        status_now.face_r[i]="B";
        status_now.face_l[i]="G";
        status_now.face_b[i]="O";
        status_now.face_d[i]="Y";
    }
    /*輸入操作指令*/
    std::string input;
    std::cin>>input;
    /*提取輸入指令,並對指令執行相應操作*/
    std::string::iterator beg = input.begin();
    std::string L = "L";
    std::string R = "R";
    std::string U = "U";
    std::string D = "D";
    std::string F = "F";
    std::string B = "B";
    for(std::string::iterator beg = input.begin();beg!=input.end();beg++){

    if ((*beg) == *(L.begin()))
    {
        L_function(status_now);
    }

    else if((*beg) == *(R.begin())){
        R_function(status_now);
    }

    else if((*beg) == *(U.begin())){
        U_function(status_now);
    }

    else if((*beg) == *(D.begin())){
        D_function(status_now);
    }

    else if((*beg) == *(F.begin())){
        F_function(status_now);
    }

    else if((*beg) == *(B.begin()))
        B_function(status_now);
    }
    /*按照規定輸出變換後的魔方狀態*/
    int num[9] = {4,6,3,0,1,2,5,8,7};
        for (int j=0;j<9;j++)
        {
            std::cout<<status_now.face_u[num[j]];
        }
        std::cout<<std::endl;

        for (int j=0;j<9;j++)
        {
            std::cout<<status_now.face_d[num[j]];
        }
        std::cout<<std::endl;

        for (int j=0;j<9;j++)
        {
            std::cout<<status_now.face_f[num[j]];
        }
        std::cout<<std::endl;

        for (int j=0;j<9;j++)
        {
            std::cout<<status_now.face_b[num[j]];
        }
        std::cout<<std::endl;

        for (int j=0;j<9;j++)
        {
            std::cout<<status_now.face_l[num[j]];
        }
        std::cout<<std::endl;

        for (int j=0;j<9;j++)
        {
            std::cout<<status_now.face_r[num[j]];
        }
        std::cout<<std::endl;   
    return 0;
}

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章