问题描述

  魔方可以对它的6个面自由旋转。

  我们来操作一个2阶魔方,如图:

  为了描述方便,我们为它建立了坐标系。

  各个面的初始状态如下:
  x轴正向:绿
  x轴反向:蓝
  y轴正向:红
  y轴反向:橙
  z轴正向:白
  z轴反向:黄

  假设我们规定,只能对该魔方进行3种操作。分别标记为:
  x 表示在x轴正向做顺时针旋转
  y 表示在y轴正向做顺时针旋转
  z 表示在z轴正向做顺时针旋转

  xyz 则表示顺序执行x,y,z 3个操作

  题目的要求是:
  用户从键盘输入一个串,表示操作序列。
  程序输出:距离我们最近的那个小方块的3个面的颜色。
  顺序是:x面,y面,z面。

输入输出用例

  例如:在初始状态,应该输出:
  绿红白

  初始状态下,如果用户输入:
  x
  则应该输出:
  绿白橙

  初始状态下,如果用户输入:
  zyx
  则应该输出:
  红白绿

思路与分析

        初看这道题时,出于本能就想到了使用二维数组来模拟6个面上的所有颜色。但苦于自己的空间想象能力略差,于是借助iPad上的笔记软件来进行绘图。但还是不够直观,怎么办呢?我想:干脆把它直接化为展开图来看,岂不是更直观?于是借助着展开图使用暴力方法将此题解开。

因我的图过于丑陋且使用文字表示颜色,并不直观。借用同站创作者同篇博客的展开图作为展示。

原文链接:蓝桥杯:魔方旋转问题【高职组】_Cod_ing的博客-CSDN博客

代码

import java.util.Scanner;public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);String str = sc.next();int[][] moFang = {{1,1,1,1}, //x轴正向{2,2,2,2}, //x轴反向{3,3,3,3}, //y轴正向{4,4,4,4}, //y轴反向{5,5,5,5}, //z轴正向{6,6,6,6}  //z轴反向};for(int i=0; i<str.length(); i++){char c = str.charAt(i);if(c=='x'){int[] s1 = new int [2];int[] s2 = new int [2];//y正-z反s1[0] = moFang[5][0];s1[1] = moFang[5][1];           moFang[5][0] = moFang[2][2];moFang[5][1] = moFang[2][0];  //z反-y反s2[0] = moFang[3][1];s2[1] = moFang[3][3];         moFang[3][1] = s1[0];moFang[3][3] = s1[1];                //y反-z正s1[0] = moFang[4][2];s1[1] = moFang[4][3];         moFang[4][3]=s2[0];moFang[4][2]=s2[1];    //z正-y正moFang[2][0]=s1[0];moFang[2][2]=s1[1];//x全对} else if(c=='y'){int[] s1 = new int [2];int[] s2 = new int [2];//z正-x反s1[0] = moFang[1][1];s1[1] = moFang[1][3];moFang[1][1] = moFang[4][3];moFang[1][3] = moFang[4][1]; //x反-z反s2[0] = moFang[5][1];s2[1] = moFang[5][3];moFang[5][1] = s1[0];moFang[5][3] = s1[1];//z反-x正s1[0]=moFang[0][1];s1[1]=moFang[0][3];moFang[0][1] = s2[0];moFang[0][3] = s2[1];//x正-z正moFang[4][1] = s1[0];moFang[4][3] = s1[1];} else if(c=='z'){int[] s1 = new int [2];int[] s2 = new int [2];//x正-y反s1[0] = moFang[3][0];s1[1] = moFang[3][1];moFang[3][0] = moFang[0][0];moFang[3][1] = moFang[0][1];//y反-x反s2[0] = moFang[1][0];s2[1] = moFang[1][1];moFang[1][0] = s1[0];moFang[1][1] = s1[1];//x反-y正s1[0] = moFang[2][0];s1[1] = moFang[2][1];moFang[2][0] = s2[0];moFang[2][1] = s2[1];//y正-x正moFang[0][0] = s1[0];moFang[0][1] = s1[1];}}String color = ""+moFang[0][1]+moFang[2][0]+moFang[4][3];for(int i=0; i<color.length(); i++){char color_a = color.charAt(i);if(color_a == '1'){System.out.print("绿");} else if(color_a == '2'){System.out.print("蓝");} else if(color_a == '3'){System.out.print("红");} else if(color_a == '4'){System.out.print("橙");} else if(color_a == '5'){System.out.print("白");} else if(color_a == '6'){System.out.print("黄");}}}
}

此代码在思维量上并没有多大的难度,关键就是在于心细!心细!心细!初看这道题时觉得蛮简单,没想到光是数x y z这些变换让我跟它磕了两个多小时。

总结

值得一提的是,我在自己编译器的测试用例下都可以通过,且答案正确。但无法在蓝桥杯的OJ上通过。100多行的代码我反复看了三四遍仍未发现问题所在。

在我寻找别人的解决方案时,发现同站的小伙伴也出现了和我一样的问题。

链接: 试题 历届真题 魔方旋转问题(Java)_地_方的博客-CSDN博客

并且在别站的早期代码同样是无法通过的状态,而我和它代码的结果是一致的,让我不得不怀疑是否网站OJ本身的测试用例出现了问题。

链接:算法笔记_233:二阶魔方旋转(Java) - 舞动的心 - 博客园 (cnblogs.com)

这大概是目前对于该题最全面的解读了,有兴趣的朋友们可以自己去试试这道题,并不难,只是较为繁琐。希望能解答你的部分疑惑,如果能帮到你,我很开心。如果有大佬使用Java将该题在OJ上通过,希望可以在评论区指点一二,万分感谢。

【蓝桥杯】历届真题 魔方旋转问题(高职组) Java相关推荐

  1. 试题 历届真题 魔方旋转问题【历届真题】【决赛】【高职组】

    这道题评测有点问题(评测点的输出全正确,结果正确率0%) 试题 历届真题 魔方旋转问题[历届真题][决赛][高职组] 资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制 ...

  2. 蓝桥杯--历届真题 回文日期【第十一届】【省赛】【B组】

    试题 历届真题 回文日期[第十一届][省赛][B组] 提交此题   评测记录 资源限制 时间限制:1.0s   内存限制:256.0MB  哎话说好久没写过日期题了,回忆起刚学的时候被日期统治的恐惧了

  3. 蓝桥杯--历届真题 最优包含【第十届】【决赛】【B组】

    试题 历届真题 最优包含[第十届][决赛][B组] 提交此题   评测记录 资源限制 时间限制:1.0s   内存限制:256.0MB  类似于:Acwing--902. 最短编辑距离(线性dp)_w ...

  4. 历届真题 魔方旋转问题【历届真题】【决赛】【高职组】

    将二阶魔方划分8个象限,每个象限分,xyz三面 . 对x旋转时相当于对[1,4, 8, 5]这四个象限顺时针旋转,zy方向颜色交换. class square:def __init__(self):s ...

  5. 超详细思维过程 杨辉三角形 蓝桥杯 历届真题

    先说前提,这题我用自己的想法只过了50%,其他用例超时了. 官网题目链接 大多数人想到的直接暴力,其实我也差不多只是很多地方思路改进 用一个二维数组存起来同时计数,遇到的时候返回计数值 最先应该是这个 ...

  6. 蓝桥杯---历届真题 题解

    试题编号 题解 问题描述 PREV-55 小计算器 模拟 PREV-54 合根植物 并查集 PREV-53 分考场 回溯 PREV-52 小数第n位 数学 PREV-51 观光铁路 PREV-50 对 ...

  7. 蓝桥杯——历届真题左hai子右兄弟-python

    思路:dp,树转换为左孩子右兄弟的二叉树后,以i为根的树的最大深度为节点i的孩 子数量+孩子中子树最深的深度.使用li[i]记录结点i的所有子节点,dp公式即为:孩子数+max(子树深度),即 len ...

  8. 蓝桥杯 历届真题 古堡算式【省赛】【本科组】

    题目描述 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE\ *\ ? = EDCBAABCDE ∗ ?=EDCBA 他对华生说:"ABCDEABCDE 应该代表不同的数字,问 ...

  9. Java实现 蓝桥杯 历届真题 数字拆分

    正整数可以表示为若干正整数的累加和.如,对于正整数n=6,可以分划为: 5+1 4+2 4+1+1 3+3 3+2+1 3+1+1+1 2+2+2 2+2+1+1 2+1+1+1+1 1+1+1+1+ ...

最新文章

  1. LVS_NAT实现负载均衡
  2. 判断数组元素相等 php,php中判断数组相等的方法以及数组运算符介绍
  3. leetcode--Reverse Integer
  4. spring 数组中随机取几个_游戏编程中需要掌握哪些数学物理知识
  5. 《剑指offer》-- 把数组排成最小的数、丑数、二进制中1的个数、表示数值的字符串、替换空格
  6. 推荐前端性能优化辅助工具Google LightHouse (灯塔)
  7. flash调用摄像头弹出设置框监听
  8. 上清华到底有多难?清华大学保送生的数学试题了解一下
  9. 艰困之道中学到的经验教训
  10. arrays中copyof复制两个数组_Core Java - Arrays
  11. P3435 [POI2006]OKR-Periods of Words
  12. POJ 2068 NIm (dp博弈,每个人都有特定的取最大值)
  13. AndroidOpenCV摄像头预览旋转90度问题
  14. 员工离职时,主管应该问相关竞业的两个问题
  15. 杭电acm 4282 A very hard mathematic problem
  16. 如何在树莓派上进行python编程_树莓派Python编程指南
  17. Oracle数据库管理(一):创建和删除数据库
  18. Experimental Class Task 4-1: Pupil Calculator
  19. h5 c3 特效网站
  20. 暾盛机器人_移动机器人视觉伺服.pdf

热门文章

  1. CS5265参数说明|CS5265设计资料|CS5265设计电流|type-CtoHDMI2.0拓展坞资料
  2. MapAbc Ajax 周边Http请求
  3. Java项目毕业设计:家庭理财记账管理系统(java
  4. Language Models are Unsupervised Multitask Learners 笔记
  5. Python批量下载 抖音无水印视频!
  6. react使用百度地图api报错BMap找不到的
  7. 案例研究:union-find(并查集) 算法
  8. Linux下如何修改网卡IP、DNS、HOSTNAME
  9. Kepware与smart200建立连接
  10. 最新服务器CPUe5,不能说的秘密 至强E5处理器背后的真相