二阶魔方旋转


魔方可以对它的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

则应该输出:

红白绿



请编程实现所述功能。


每次旋转有12个面发生变化


#include<stdio.h>
#include<string.h>
char map[27];
void init(){
	map[1]='a'; map[2]='a'; map[9]='a'; map[10]='a'; //绿 
	map[3]='b'; map[4]='b'; map[11]='b'; map[12]='b'; // 红 
	map[17]='c'; map[18]='c'; map[19]='c'; map[20]='c'; //白 
	map[21]='d';map[22]='d';map[23]='d';map[24]='d';//黄 
	map[7]='e';map[8]='e';map[15]='e';map[16]='e';//橙 
	map[13]='f';map[14]='f';map[5]='f';map[6]='f';//蓝 
}
void x(){
	char s[12];
	s[0]=map[16];s[1]=map[8];s[2]=map[19];s[3]=map[20];s[4]=map[3];s[5]=map[11];s[6]=map[24];s[7]=map[23];
	s[8]=map[9];s[9]=map[1];s[10]=map[10];s[11]=map[2];
	map[19]=s[0];map[20]=s[1];map[3]=s[2];map[11]=s[3];map[24]=s[4];map[23]=s[5];map[16]=s[6];map[8]=s[7];
	map[1]=s[8];map[2]=s[9];map[9]=s[10];map[10]=s[11];
}
void y(){
	char s[12];
	s[0]=map[22];s[1]=map[24];s[2]=map[10];s[3]=map[2];s[4]=map[20];s[5]=map[18];s[6]=map[5];s[7]=map[13];
	s[8]=map[11];s[9]=map[3];s[10]=map[4];s[11]=map[12];
	map[10]=s[0];map[2]=s[1];map[20]=s[2];map[18]=s[3];map[5]=s[4];map[13]=s[5];map[22]=s[6];map[24]=s[7];
	map[3]=s[8];map[4]=s[9];map[11]=s[10];map[12]=s[11];
} 
void z(){
	char s[12];
	s[0]=map[6];s[1]=map[5];s[2]=map[4];s[3]=map[3];s[4]=map[2];s[5]=map[1];s[6]=map[8];s[7]=map[7];
	s[8]=map[19];s[9]=map[17];s[10]=map[20];s[11]=map[18];
	map[4]=s[0];map[3]=s[1];map[2]=s[2];map[1]=s[3];map[8]=s[4];map[7]=s[5];map[6]=s[6];map[5]=s[7];
	map[17]=s[8];map[18]=s[9];map[19]=s[10];map[20]=s[11];
}
void show(char s){
	switch (s){
		case 'a':
		printf("绿");
		break;
		case 'b':
		printf("红");
		break;
		case 'c':
		printf("白");
		break;
		case 'd':
		printf("黄");
		break;
		case 'e':
		printf("橙");
		break;
		case 'f':
		printf("蓝");
		break;
	}
	
			
			
}
int main(){
	init();
	char s[1000];
	int n;
	scanf("%s",s);
	n=strlen(s);
	for(int i=0;i<n;i++){
		switch(s[i]){
			case 'x':
				x();
				break;
			case 'y':
				y();
				break;
			case 'z':
				z();
				break;
		}
	}
	show(map[2]);
	show(map[3]);
	show(map[20]);
	
	printf("\n");
}


//存为MoFang.java import java.applet.Applet ; import java.awt.*; import com.sun.j3d.utils.applet.MainFrame ; import java.awt.BorderLayout ; import com.sun.j3d.utils.universe.SimpleUniverse ; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.behaviors.mouse.*; import com.sun.j3d.utils.behaviors.keyboard.*; import com.sun.j3d.utils.picking.behaviors.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.image.TextureLoader ; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame.*; import javax.swing.*; class mySimpleUniverse extends Applet { BranchGroup createSceneGraph(Canvas3D canvas) { //System.out.print("**1**"); //创建变换组,无用的t3D Transform3D t3d=new Transform3D(); TransformGroup trans=new TransformGroup(t3d); trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); //创建分枝组 BranchGroup objRoot=new BranchGroup(); //测试 //SomeShape3D.book3D( this, trans); SomeShape3D.addText3DDonghua(trans,"魔方",new Point3f(-7.0f,6.0f,6.0f),0.1f,new Color3f(1.0f,0.0f,0.0f),1); //初始化数据结构 System.out.println("\n\n载入方块,并向变换组中加入每个方块的坐标系和方块..."); for(int i=0;i<=2;i++) for(int j=0;j<=2;j++) for(int k=0;k<=2;k++) { int[] p; p=Position.getPxyzFromPositionAy(i,j,k,MoFang.positionArray); MoFang.blockArray[i][j][k]=new Block(i,j,k,p[0],p[1],p[2],trans,t3d,objRoot,this); } System.out.println("加入每个方块的坐标系和方块,完成.\n"); //创建大坐标轴,自动加到主坐标系 SomeShape3D.zuoBiaoZhuBigXShape3D(trans); SomeShape3D.zuoBiaoZhuBigYShape3D(trans); SomeShape3D.zuoBiaoZhuBigZShape3D(trans); //创建边界对象 BoundingSphere bounds=new BoundingSphere(new Point3d(0.0,0.0,0.0),100); //创建鼠标pick行为,加到分支组objRoot PickRotateBehavior pickRotate=new PickRotateBehavio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值