每天一道算法题(33)——阿里巴巴之魔方翻转_c++表示魔方每步旋转结果-程序员宅基地

技术标签: 阿里巴巴  魔方  工作之笔试  每天一道算法题  秋招  

题目:

    阿里巴巴2015秋招机试题目:

一个三阶魔方由六个面组成,颜色分别是白色(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


代码:

       定义面的类。涉及输出函数,面与面之间上下左右4个方向、3个方向块的两两对应交换或者逆转交换函数exchange。

class face{// each face
public:
int color[3][3];
face(){
		for(int i=0;i<3;i++)
			for(int j=0;j<3;j++)
			   color[i][j]=-1;
}
face(const face& f){
		for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			color[i][j]=f.color[i][j];
}
void inni(int c){
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			   color[i][j]=c;
  }
void exChange(const face& f,char source,char dest,bool flag=false);
void selfChange();
void trans(int i);
void print();
};
void face::print(){//print one face; 
	trans(color[1][1]);
	trans(color[2][0]);trans(color[1][0]);trans(color[0][0]);
	trans(color[0][1]);trans(color[0][2]);trans(color[1][2]);
	trans(color[2][2]);trans(color[2][1]);
	cout<<endl;
}
void face::trans(int i){
		switch(i){
		case 0:
			cout<<'W';break;
		case 1:
			cout<<'Y';break;		
		case 2:
			cout<<'R';break;		
		case 3:
			cout<<'O';break;		
		case 4:
			cout<<'G';break;
		case 5:
			cout<<'B';break;
	}
}
void face::exChange(const face& f,char source,char dest,bool flag){//the 'source' color of  f to dest color of current face, u-d-l-r means direction, 
	int data[3];
	switch(source){
			case 'U'://操作
			{
				data[0]=f.color[0][0];
				data[1]=f.color[0][1];
				data[2]=f.color[0][2];
				break;
			}
		  case 'D':
			{
				data[0]=f.color[2][0];
				data[1]=f.color[2][1];
				data[2]=f.color[2][2];
				break;
			}	
		case 'L':
			{
				data[0]=f.color[0][0];
				data[1]=f.color[1][0];
				data[2]=f.color[2][0];
				break;
			}		
		case 'R':
			{
				data[0]=f.color[0][2];
				data[1]=f.color[1][2];
				data[2]=f.color[2][2];
				break;
			}
	}
	if(flag){
		int temp=data[0];
		data[0]=data[2];
		data[2]=temp;
	}
	switch(dest){
		case 'U'://操作
			{
				color[0][0]=data[0];
				color[0][1]=data[1];
				color[0][2]=data[2];
				break;
			}
		  case 'D':
			{
				color[2][0]=data[0];
				color[2][1]=data[1];
				color[2][2]=data[2];
				break;
			}	
		case 'L':
			{
				color[0][0]=data[0];
				color[1][0]=data[1];
				color[2][0]=data[2];
				break;
			}		
		case 'R':
			{
				color[0][2]=data[0];
				color[1][2]=data[1];
				color[2][2]=data[2];
				break;
			}
	}
}//the color 
void face::selfChange(){// the change of current face
	int temp;
	temp=color[0][0];
	color[0][0]=color[2][0];
	color[2][0]=color[2][2];
	color[2][2]=color[0][2];
	color[0][2]=temp;

	temp=color[0][1];
	color[0][1]=color[1][0];
	color[1][0]=color[2][1];
	color[2][1]=color[1][2];
	color[1][2]=temp;
}//


         定义魔方类。定义某一种旋转时,颜色变动函数change。此时,面朝自己的魔方会变化selfchange(),且该面接壤的四个面的上下左右的四个方向之一,组成链式4次变动。

class cube{
	face mian[6];
public :
	cube(){
		for(int i=0;i<6;i++)
			mian[i].inni(i);
	}
	void print(){
		for(int i=0;i<6;i++)
			mian[i].print();
	}
	void change(char o);
};


void cube::change(char op){
	face* f=NULL;
	switch(op){
		case 'U':
			{
				mian[0].selfChange();
				f=new face(mian[2]);
				mian[2].exChange(mian[5],'U','U');
				mian[5].exChange(mian[3],'U','U');
				mian[3].exChange(mian[4],'U','U');
				mian[4].exChange(*f,'U','U');
				break;
			}
		case 'D':
			{
				mian[1].selfChange();
				f=new face(mian[2]);
				mian[2].exChange(mian[4],'D','D');
				mian[4].exChange(mian[3],'D','D');
				mian[3].exChange(mian[5],'D','D');
				mian[2].exChange(*f,'D','D');			
				break;
			}	
		case 'F':
			{
				mian[2].selfChange();
				f=new face(mian[4]);
				mian[4].exChange(mian[1],'U','R');
				mian[1].exChange(mian[5],'L','U',true);
				mian[5].exChange(mian[0],'D','L');
				mian[0].exChange(*f,'R','D',true);
				break;
			}		
		case 'B':
			{
				mian[3].selfChange();
				f=new face(mian[0]);
				mian[0].exChange(mian[5],'R','U');
				mian[5].exChange(mian[1],'D','R',true);
				mian[1].exChange(mian[4],'L','D');
				mian[4].exChange(*f,'U','L',true);
				break;
			}
		case 'L':
			{
				mian[4].selfChange();
				f=new face(mian[0]);
				mian[0].exChange(mian[3],'R','L',true);
				mian[3].exChange(mian[1],'L','R',true);
				mian[1].exChange(mian[2],'L','L');
				mian[2].exChange(*f,'L','L');
				break;
			}
		case 'R':
			{
				mian[5].selfChange();
				f=new face(mian[0]);
				mian[0].exChange(mian[2],'R','R');
				mian[2].exChange(mian[1],'R','R');
				mian[1].exChange(mian[3],'L','R',true);
				mian[3].exChange(*f,'R','L',true);
				break;
			}
	}
	if(f)
	     delete f;
	return ;
}

       主函数

int main()
{
	string s;
	getline(cin,s);
	cube c;
	if(!s.empty())
	   for(int i=0;i<s.size();i++)
		   c.change(s[i]);
	c.print();
	return 0;
}

        注意,由于定义的魔方的上下左右方向不一致,可能发生输出不一定相同,但是除去第一个中心元素外,其它元素组成的链经过若干次移位2位的循环也可以达到同样的结果。




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qianhen123/article/details/47909609

智能推荐

yolov5测试单张图片-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏20次。yolov5测试单张图片,返回一个列表[类别,置信度,x,y,w,h]from numpy import randomimport torchfrom models.experimental import attempt_loadfrom utils.datasets import LoadStreams, LoadImagesfrom utils.general import ( check_img_size, non_max_suppression, apply_classifier_yolov5测试单张图片

SQL做的能改成Oracle吗,从SQL改写到SQL重写,什么样的SQL才是好SQL?(黄浩)-程序员宅基地

文章浏览阅读88次。从SQL改写到SQL重写,什么样的SQL才是好SQL?黄浩 2016-12-14 10:02:26作者介绍黄浩,现任职于中国惠普,从业十年,始终专注于SQL。十年一剑,十年磨砺。3年通信行业,写就近3万条SQL;5年制造行业,遨游在ETL的浪潮;2年性能优化,厚积薄发自成一家。在生活中,很多时候我们会有这样的体悟:问题要么不出,一旦出现,会像多诺米骨牌一样,会连锁引发诸多相关问题,让我们疲于应付。..._黄浩 sql

.NET 学习教程下载地址_.net课程下载-程序员宅基地

文章浏览阅读578次,点赞2次,收藏2次。==============================================================================================================教程&电子书==============================================================================================================C#入门经典_.net课程下载

STM32F7 + FREERTOS + LWIP 接收数据从网卡到应用层完整流程_stm32f7 lwip-程序员宅基地

文章浏览阅读3.8k次,点赞2次,收藏8次。来来来,这里解释下从网卡PHY到IP层的数据接收流程:这里是以函数调用方式来体现:netif_add——》ethernetif_init——》low_level_init——》ethernetif_input——》low_level_input和tcpip_input——》ethernet_input——》ip4_input(etharp_input、pppoe_disc_input)——》udp..._stm32f7 lwip

Linux服务器Input/output error错误_linux 写入文件到挂载的nas下提示failed to close...input/output-程序员宅基地

文章浏览阅读1.6w次。报错系统Centos报错提示Input/output error检查服务器机器中多硬盘是否其中有一块硬盘坏掉了。第二种可能:RAID阵列可能有问题。。。_linux 写入文件到挂载的nas下提示failed to close...input/output error

DevExpress SearchControl搜索框中的问题提示_devexpress searchcontrol1-程序员宅基地

文章浏览阅读4k次。SearchControl搜索框中的问题提示,代码为: this.searchControl1.Properties.NullValuePrompt = "请输入搜索关键字";_devexpress searchcontrol1

随便推点

pyqt5界面开发-制作程序集合桌面-基本的框架_用pyqt做程序集合的界面-程序员宅基地

文章浏览阅读340次。pyqt5界面开发-制作多个小程序-基本的框架和思路最近现在无事,看到了电脑桌面,又想到了最近入门的pyqt5,再看看以往的程序,想到了可不可以做一个集成的UI桌面_用pyqt做程序集合的界面

对网站商城源码的研究分析 分享大量源码下载_chengren 电影-程序员宅基地

文章浏览阅读2k次。第一部分(1-6):前端纯静态网页模板无后台+大量网站设计素材 1:PC模板: 9900套响应式html5+css3网页模板【页面齐,二级,三级页均有,含中文模板】 2:PSD模板:3000套PSD模板+600套Flash酷站源文件+千套矢量ICO图标 3:手机模板:2000套各行业中文手机..._chengren 电影

ORA-39143: 转储文件 "F:\ora10G_expdp\ic_price_fromlufang.dmp" 可能是原始的导出转 储文件...-程序员宅基地

文章浏览阅读441次。连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProductionWith the Partitioning, OLAP and Data Mining optionsORA-39001: 参数值无效ORA-39000: 转储文件说明错误ORA-39143: 转储文件 "F:\ora10G_expdp\ic_pri..._ora39143

8.4 输入某班学生某门课的成绩,(最多不超过40人,具体人数由用户键盘输入),用函数编程统计不及格人数-程序员宅基地

文章浏览阅读3.4w次,点赞16次,收藏28次。#includemain(){ int n,a[40],i,count=0; printf("请输入学生人数:"); scanf("%d",&n); printf("请输入各学生成绩:\n"); for(i=0;i

JAVASE笔记回顾-程序员宅基地

文章浏览阅读391次。第一部分,JAVA基础和面向对象 part01 入门与开发环境搭建 1: 计算机基础知识(了解)(1)计算机(2)计算机硬件(3)计算机软件系统软件:windows,linux,mac应用软件:QQ,YY,扫雷,CS/F(4)软件开发就是用开发工具和计算机语言做出软件(5)计算机语言人与计算机的交流方式(6)人机交互A:图像界面方便,简单,直观。B:DOS 窗口方式要有控制台, 要记住很多的命令,..._cuser.getchinese().equals("null")

将 PDF 转换为矢量图 emf_pdf转emf-程序员宅基地

文章浏览阅读2w次,点赞15次,收藏43次。此篇博客介绍了一种将PDF转换为矢量图emf、编辑emf的方法(需要Adobe Acrobat)_pdf转emf

推荐文章

热门文章

相关标签