蓝桥杯-魔方旋转




4. 魔方旋转
【问题描述】
魔方可以对它的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
则应该输出:
红白绿

面的标号

模仿旋转示意图


我的c++代码:

#include<iostream>
#include<string>
using namespace std;

string f[4]={"绿","绿","绿","绿"};
string l[4]={"橙","橙","橙","橙"};
string r[4]={"红","红","红","红"};
string d[4]={"黄","黄","黄","黄"};
string u[4]={"白","白","白","白"};
string b[4]={"蓝","蓝","蓝","蓝"};
//answer= f[1],r[0],u[2]

void x()
{
	string temp1=l[1];
	string temp2=l[2];
	l[1] = d[0];
	l[2] = d[1];
	d[0] = r[3];
	d[1] = r[0];
	r[3] = u[2];
	r[0] = u[3];
	u[2] = temp1;
	u[3] = temp2;

	temp1 =f[0];
	f[0] = f[3];
	f[3] = f[2];
	f[2] = f[1];
	f[1] = temp1;
}

void y()
{
	string temp1=f[1];
	string temp2=f[2];
	f[1] = d[1];
	f[2] = d[2];
	d[1] = b[3];
	d[2] = b[0];
	b[3] = u[1];
	b[0] = u[2];
	u[1] = temp1;
	u[2] = temp2;

	temp1 =r[0];
	r[0] = r[3];
	r[3] = r[2];
	r[2] = r[1];
	r[1] = temp1;
}

void z()
{
	string temp0=l[0];
	string temp1=l[1];
	l[0] = f[0];
	l[1] = f[1];
	f[0] = r[0];
	f[1] = r[0];
	r[0] = b[0];
	r[1] = b[1];
	b[0] = temp0;
	b[1] = temp1;

	temp1 =u[0];
	u[0] = u[3];
	u[3] = u[2];
	u[2] = u[1];
	u[1] = temp1;
}

int main()
{	
	string str;
	cin>>str;
	for(int i=0 ; i<(int)str.length(); i++)
	{
		string temp = str.substr(i,1);
		if(temp == "x")
			x();
		if(temp == "y")
			y();
		if(temp == "z")
			z();
	}
	cout<<f[1]<<r[0]<<u[2];
	return 0;
}
//存为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、付费专栏及课程。

余额充值