• 蓝桥杯---二阶魔方旋转



    魔方可以对它的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
    则应该输出:
    红白绿



    请编程实现所述功能。

    开始的时候真的不知道该怎么实现,试过了好多次,结果只要是一转就会有情况是错的,所以直接全部模拟,我用mark 来记录各个面的颜色情况,并根据旋转的方式进行及时的更新,在这里我是这样定义的,首先数组的每一行分别代表的是每一个面,也就是下图中的大写一二三,而数组的每一行也就是每一个面中的每一块也是按照下图中的1234分别编号,这样的话,开始的时候给他们初始的颜色,在每一次转动的时候对改变了的进行及时的更新,在最后的时候只要输出右上角的那块的xyz分别对应的颜色就好了(在我的这里就是[1][2]  [5][1]  [2][4])


    不过在这里我用了一点小小的技巧就是用整形数组来存储颜色,每一面的每一块用一个唯一的标号来记录,最后由于开始的时候每一个面的十分位数子一样,在取余输出就好了,但是这样的话因为只要输出颜色就行,其实在开始定义的时候完全可以直接记录颜色,这样应该更方便很多,但是由于开始的时候还不是太清晰,所以就这样做了,现在既然明白了就没有必要改了,这样也算自己的做题历程吧。。。


    #include <iostream>
    #include <cstdio>
    #include <memory.h>
    #include <cmath>
    using namespace std;
    int main (){
    string str;
    cin>>str;
    int mark[7][5]={ {0,0,0,0,0},{0,11,12,13,14},{0,21,22,23,24},{0,31,32,33,34},{0,41,42,43,44},{0,51,52,53,54},{0,61,62,63,64}};
    int len = str.length();
    for(int i=0;i<len;i++){
    	if(str[i]=='x'){
    	   int temp1 = mark[2][4],temp2 =mark[2][3];
    		mark[2][4]=mark[6][2],mark[2][3]=mark[6][4],//上面 
    		mark[6][2]=mark[4][1],mark[6][4]=mark[4][2],	
    		mark[4][1]=mark[5][3],mark[4][2]=mark[5][1];	
    		mark[5][3]=temp1,mark[5][1]=temp2;
    		
    		temp1=mark[1][1];
    		mark[1][1]=mark[1][3],mark[1][3]=mark[1][4],mark[1][4]=mark[1][2],mark[1][2]=temp1; 
    	}
    	if(str[i]=='y'){
    		int temp1 = mark[4][2],temp2 =mark[4][4];
    		mark[4][2]=mark[3][3],mark[4][4]=mark[3][1];
    		mark[3][3]=mark[2][2],mark[3][1]=mark[2][4];	
    		mark[2][2]=mark[1][2],mark[2][4]=mark[1][4];	
    		mark[1][2]=temp1,mark[1][4]=temp2;
    		
    		temp1=mark[5][4];
    		mark[5][4]=mark[5][2],mark[5][2]=mark[5][1],mark[5][1]=mark[5][3],mark[5][3]=temp1; 
    	}
    	if(str[i]=='z'){
    	 int temp1 = mark[1][1],temp2 =mark[1][2];
    		mark[1][2]=mark[5][2],mark[1][1]=mark[5][1];
    		mark[5][2]=mark[3][2],mark[5][1]=mark[3][1];	
    		mark[3][1]=mark[6][1],mark[3][2]=mark[6][2];	
    		mark[6][1]=temp1,mark[6][2]=temp2;
    		
    		temp1=mark[2][1];
    		mark[2][1]=mark[2][3],mark[2][3]=mark[2][4],mark[2][4]=mark[2][2],mark[2][2]=temp1; 
    	}
    }
    string tepstr[7] = {"","绿","白","蓝","黄","红","橙"};
    cout<<tepstr[ mark[1][2]/10 ]<<tepstr[ mark[5][1]/10 ]<<tepstr[ mark[2][4]/10 ]<<endl;
     return 0;
    }
    





  • 相关阅读:
    layui穿梭框内容溢出解决办法
    location之alias浅析
    Semaphore和SemaphoreSlim实现并发同步
    Barrier实现并发同步
    CountdownEvent实现并发同步
    AutoResetEvent实现并发同步
    TrieTree树
    EncryptByPassPhrase与DecryptByPassPhrase的浅说
    一个mp4转gif的网站
    vue轮播图(可随父元素高宽自适应)
  • 原文地址:https://www.cnblogs.com/zswbky/p/5431988.html
Copyright © 2020-2023  润新知