对一个复原魔方进行操作,记录操作后魔方状态
来源:互联网 发布:php项目案例 编辑:程序博客网 时间:2024/05/01 13:32
下面为为阿里巴巴的一道笔试题
一个三阶魔方由六个面组成,颜色分别是白色(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|23|4|56|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;}
0 0
- 对一个复原魔方进行操作,记录操作后魔方状态
- MATLAB对三阶魔方建模并进行旋转操作
- 二阶魔方旋转 魔方可以对它的6个面自由旋转。 我们来操作一个2阶魔方(如图1所示):
- android 3d魔方 魔方复原 三维魔方 源码下载
- 魔方复原的编程实现
- 终于可以复原魔方了
- 最快的魔方复原方法
- 三阶魔方复原公式
- 不看公式自己复原魔方
- 魔方
- 魔方
- 魔方
- 魔方
- 魔方
- 魔方
- 魔方
- 魔方
- 魔方
- JavaEE-01-温故(集合、泛型、io、多线程)&知新(junit、内省、路径问题)
- mathtype行距被撑大的解决方案
- 哈夫曼树--最优二叉树
- 扫雷游戏 C#
- 如何确定一个N!末尾有多少个零
- 对一个复原魔方进行操作,记录操作后魔方状态
- Rikka with string-------(BestCoder Round #37)
- JSP Learning Notes 2
- JS对象,以及对应方法
- 佛家吃肉的问题
- 【Java】基础语法
- MIT HAKMEM算法分析
- 用Java实现的帧动画效果
- Linux下netstat和vmstat以及ifstat的使用