| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1433 人关注过本帖, 1 人收藏
标题:二阶魔方
取消只看楼主 加入收藏
lcb227107898
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-4-8
结帖率:0
收藏(1)
已结贴  问题点数:10 回复次数:1 
二阶魔方

魔方可以对它的6个面自由旋转。

我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。

各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄

假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转

xyz 则表示顺序执行x,y,z 3个操作

题目的要求是:
从标准输入获得一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。

例如:在初始状态,应该输出:
绿红白

初始状态下,如果用户输入:
x
则应该输出:
绿白橙

初始状态下,如果用户输入:
zyx
则应该输出:
红白绿


请编程实现所述功能。
这个是蓝桥杯某年的决赛题目,我上网找了答案,可是答案看了很久看不懂,求各位帮忙注释一下每行代码的功能可以么?




#include <iostream>   
#include <string>   
  
using namespace std;  
  
static int A[4];  
static int B[4];  
static int C[4];  
static int D[4];  
static int E[4];  
static int F[4];  
  
#define GREEN   1   
#define WHITE   2   
#define ORANGE  3   
#define RED     4   
#define YELLOW  5   
#define BLUE    6   
  
string get_color(int id)  
{  
    switch (id)  
    {  
    case GREEN:  
        return "绿";  
    case WHITE:  
        return "白";  
    case ORANGE:  
        return "橙";  
    case RED:  
        return "红";  
    case YELLOW:  
        return "黄";  
    case BLUE:  
        return "蓝";  
    }  
}  
void init()  
{  
    for (int i = 0;i < 4;i++)  
    {  
        A[i] = GREEN;  
        B[i] = WHITE;  
        C[i] = ORANGE;  
        D[i] = RED;  
        E[i] = YELLOW;  
        F[i] = BLUE;  
    }  
}  
void x_rotate()  
{  
    int t1 = A[0];  
    int t2 = 0;  
    A[0] = A[2];  
    A[2] = A[3];  
    A[3] = A[1];  
    A[1] = t1;  
  
    t1 = E[0];  
    t2 = E[1];  
  
    E[0] = D[3];  
    E[1] = D[2];  
  
    D[2] = B[2];  
    D[3] = B[3];  
  
    B[2] = C[2];  
    B[3] = C[3];  
  
    C[2] = t2;  
    C[3] = t1;  
    return;  
}  
void y_rotate()  
{  
    int t1 = D[0];  
    int t2 = 0;  
  
    D[0] = D[2];  
    D[2] = D[3];  
    D[3] = D[1];  
    D[1] = t1;  
  
    t1 = F[1];  
    t2 = F[3];  
  
    F[1] = B[1];  
    F[3] = B[3];  
  
    B[1] = A[1];  
    B[3] = A[3];  
  
    A[1] = E[1];  
    A[3] = E[3];  
  
    E[1] = t1;  
    E[3] = t2;  
    return;  
}  
void z_rotate()  
{  
    int t1 = B[0];  
    int t2 = 0;  
  
    B[0] = B[2];  
    B[2] = B[3];  
    B[3] = B[1];  
    B[1] = t1;  
  
    t1 = F[2];  
    t2 = F[3];  
  
    F[2] = C[3];  
    F[3] = C[1];  
  
    C[1] = A[0];  
    C[3] = A[1];  
  
    A[0] = D[2];  
    A[1] = D[0];  
  
    D[2] = t2;  
    D[0] = t1;  
    return;  
}  
int main()  
{  
    string str;  
    while (cin >> str)  
    {  
        init();  
        for (int i = 0;i < str.size();i++)  
        {  
            switch (str[i])  
            {  
            case 'x':  
                x_rotate();  
                break;  
            case 'y':  
                y_rotate();  
                break;  
            case 'z':  
                z_rotate();  
                break;  
            }  
        }  
        cout << get_color(A[1]) << get_color(D[2]) << get_color(B[3]) << endl;  
    }  
    return 0;  
}  

搜索更多相关主题的帖子: 顺时针 坐标系 
2013-04-28 20:39
lcb227107898
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-4-8
收藏
得分:0 
回复 3楼 邓士林
每一面上的旋转思想是什么(即为什么是这样的旋转),就是不懂这个了。。
2013-04-29 18:24
快速回复:二阶魔方
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021833 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved