阿里巴巴2015秋招算法类机试题目(三阶魔方)

  1. 题目
    一个三阶魔方由六个面组成,颜色分别是白色(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/C++,Java或Python语言实现。请注意尽量以可成功编译或可直接运行为标准来编写代码。

示例:
输入:
LR
输出:
WOOOWRRRW
YRRRYOOOY
RWWWRYYYR
OYYYOWWWO
GGGGGGGGG
BBBBBBBBB
2. 自己编写的程序

////////////////////////////
////MagicCube.h 

#include "stdafx.h"
#include<iostream>
using namespace std;
//定义每个面作为一个类
class cover
{
public:
    cover(char cen);
    ~cover();

    void Curfaceturn();
    void display();
    char Elem1,Elem2,Elem3,Elem4,Elem5,Elem6,Elem7,Elem8;//每个面的周边元素,从左下角开始为Elem1
private:
    char center;  //每个面的中心点,每个面中心颜色是确定的,也是每个面之所以为这个面的决定性属性
    //后续颜色将不再改变,所以是类的私有数据成员。
};

cover::cover(char cen) //面类的构造函数,在构造函数里对每个面的九个点进行颜色初始化
{
    center=cen;  
    Elem1=Elem2=Elem3=Elem4=Elem5=Elem6=Elem7=Elem8=cen;
}

cover::~cover()
{
}
void cover::Curfaceturn()  //每个面顺时针旋转时,其元素替换规律是一样的,所以可以只用类的成员函数来描述
{
    char E1,E2,E3;
    E1=Elem1;E2=Elem2;E3=Elem3;//记住当前面的三个元素的值
    Elem3=Elem1;
    Elem2=Elem8;
    Elem1=Elem7;
    Elem8=Elem6;
    Elem7=Elem5;
    Elem6=Elem4;
    Elem5=E3;
    Elem4=E2;
}
void cover::display()//输出每个面的不同点的颜色
{
    cout<<center<<Elem1<<Elem2<<Elem3<<Elem4<<Elem5<<Elem6<<Elem7<<Elem8<<endl;
}
// MagicCube.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"MagicCube.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    cover Cred('R'),Corenge('O'),Cwhite('W'),Cyellow('Y'),Cgreen('G'),Cblue('B');
    char choice;
    char N1,N2,N3,N4,N5,N6,N7,N8;

    char s[20];

    cout<<"您可以对魔方做如下操作:"<<endl;
    cout<<"1)U:白色面顺时针旋转90度"<<endl;
    cout<<"2)D:黄色面顺时针旋转90度"<<endl;
    cout<<"3)F:红色面顺时针旋转90度"<<endl;
    cout<<"4)B:橙色面顺时针旋转90度"<<endl;
    cout<<"5)L:绿色面顺时针旋转90度"<<endl;
    cout<<"6)R:蓝色面顺时针旋转90度"<<endl;
    cin>>s;
    int i=0;
    while (s[i]!='\0')
    {
        choice=s[i];

    switch (choice)
    {
    case 'U':Cwhite.Curfaceturn();//面旋转,自身元素的更新
        //接下来是不同面之间元素的更新
        N3=Cred.Elem3;
        N4=Cred.Elem4;
        N5=Cred.Elem4;

        Cred.Elem3=Cblue.Elem3;
        Cred.Elem4=Cblue.Elem4;  
        Cred.Elem5=Cblue.Elem5;

        Cblue.Elem3=Corenge.Elem7; 
        Cblue.Elem4=Corenge.Elem8;
        Cblue.Elem5=Corenge.Elem1;

        Corenge.Elem7=Cgreen.Elem3;
        Corenge.Elem8=Cgreen.Elem4;
        Corenge.Elem1=Cgreen.Elem5;

        Cgreen.Elem3=N3; 
        Cgreen.Elem4=N4; 
        Cgreen.Elem5=N5;

        break;
    case 'D':Cyellow.Curfaceturn();
        N1=Cred.Elem1;
        N8=Cred.Elem8;
        N7=Cred.Elem7;

        Cred.Elem1=Cgreen.Elem1;
        Cred.Elem8=Cgreen.Elem8;
        Cred.Elem7=Cgreen.Elem7;

        Cgreen.Elem1=Corenge.Elem5;
        Cgreen.Elem8=Corenge.Elem4;
        Cgreen.Elem7=Corenge.Elem3;

        Corenge.Elem5=Cblue.Elem1;
        Corenge.Elem4=Cblue.Elem8;
        Corenge.Elem3=Cblue.Elem7;

        Cblue.Elem1=N1;
        Cblue.Elem8=N8;
        Cblue.Elem7=N7;
        break;
    case 'F':Cred.Curfaceturn();
        N1=Cwhite.Elem1;
        N8=Cwhite.Elem8;
        N7=Cwhite.Elem7;

        Cwhite.Elem1=Cgreen.Elem7;
        Cwhite.Elem8=Cgreen.Elem6;
        Cwhite.Elem7=Cgreen.Elem5;

        Cgreen.Elem7=Cyellow.Elem5;
        Cgreen.Elem6=Cyellow.Elem4;
        Cgreen.Elem5=Cyellow.Elem3;

        Cyellow.Elem5=Cblue.Elem3;
        Cyellow.Elem4=Cblue.Elem2;
        Cyellow.Elem3=Cblue.Elem1;

        Cblue.Elem3=N1;
        Cblue.Elem2=N8;
        Cblue.Elem1=N7;
        break;
    case 'B':Corenge.Curfaceturn();
        N3=Cwhite.Elem3;
        N4=Cwhite.Elem4;
        N5=Cwhite.Elem5;

        Cwhite.Elem3=Cblue.Elem5;
        Cwhite.Elem4=Cblue.Elem6;
        Cwhite.Elem5=Cblue.Elem7;

        Cblue.Elem5=Cyellow.Elem7;
        Cblue.Elem6=Cyellow.Elem8;
        Cblue.Elem7=Cyellow.Elem1;

        Cyellow.Elem7=Cgreen.Elem1;
        Cyellow.Elem8=Cgreen.Elem2;
        Cyellow.Elem1=Cgreen.Elem3;

        Cgreen.Elem1=N3;
        Cgreen.Elem2=N4;
        Cgreen.Elem3=N5;
        break;
    case 'L':Cgreen.Curfaceturn();
        N3=Cwhite.Elem3;
        N2=Cwhite.Elem2;
        N1=Cwhite.Elem1;

        Cwhite.Elem3=Corenge.Elem3;
        Cwhite.Elem2=Corenge.Elem3;
        Cwhite.Elem1=Corenge.Elem1;

        Corenge.Elem3=Cyellow.Elem3;
        Corenge.Elem2=Cyellow.Elem2;
        Corenge.Elem1=Cyellow.Elem1;

        Cyellow.Elem3=Cred.Elem3;
        Cyellow.Elem2=Cred.Elem2;
        Cyellow.Elem1=Cred.Elem1;

        Cred.Elem3=N3;
        Cred.Elem2=N2;
        Cred.Elem1=N1;
        break;
    case 'R':Cblue.Curfaceturn();
        N5=Cwhite.Elem5;
        N6=Cwhite.Elem6;
        N7=Cwhite.Elem7;

        Cwhite.Elem5=Cred.Elem5;
        Cwhite.Elem6=Cred.Elem6;
        Cwhite.Elem7=Cred.Elem7;

        Cred.Elem5=Cyellow.Elem5;
        Cred.Elem6=Cyellow.Elem6;
        Cred.Elem7=Cyellow.Elem7;

        Cyellow.Elem5=Corenge.Elem5;
        Cyellow.Elem6=Corenge.Elem6;
        Cyellow.Elem7=Corenge.Elem7;

        Corenge.Elem5=N5;
        Corenge.Elem6=N6;
        Corenge.Elem7=N7;
        break;
    default:
        break;
    }
        i++;
    }

    Cwhite.display();
    Cyellow.display();
    Cred.display();
    Corenge.display();
    Cgreen.display();
    Cblue.display();

    system("pause");
    return 0;
}

编译环境VS2012,编译结果:
这里写图片描述
才疏学浅,敬请指针,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值