zoukankan      html  css  js  c++  java
  • 蓝桥杯---二阶魔方旋转


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





  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/zswbky/p/5431988.html
Copyright © 2011-2022 走看看