[JAVA][2013蓝桥杯模拟赛 JAVA本科B组][第四题:二阶魔方]

【题目取自CSDN-671coder】

第四题:二阶魔方

题目描述:

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

我们来操作一个2阶魔方(如图1所示)

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

各个面的初始状态如下:

x轴正向:绿

x轴反向:蓝

y轴正向:红

y轴反向:橙

z轴正向:白

z轴反向:黄

假设我们规定,只能对该魔方进行3种操作。分别标记为:

x 表示在x轴正向做顺时针旋转

y 表示在y轴正向做顺时针旋转

z 表示在z轴正向做顺时针旋转

基本旋转后的效果如图2,3,4所示。

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

题目的要求是:

从标准输入获得一个串,表示操作序列。

程序输出:距离我们最近的那个小方块的3个面的颜色。

顺序是:x面,y面,z面。

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

绿红白

初始状态下,如果用户输入:

x

则应该输出:

绿白橙

初始状态下,如果用户输入:

zyx

则应该输出:

红白绿

样例输入:

xy

xxyyy

xyzzzzyyyxxx

xyyzzz

xyxyzzxyxyzz

样例输出:

红白绿

白红蓝

绿红白

黄绿橙

白绿红

解答

分析,设置方块类(取名叫Main而已)

对应正面的四个方块为

front[0] front[1]

front[2] front[3]

和正面方块相邻的反面方块的下标相同(即front[0]后面是back[0],1后面是back[1])

其他只要注意转动时的变化就行

[java] view
plain
copyprint?

  1. import java.util.Scanner;
  2. public class Main {
  3. char front;
  4. char back;
  5. char left;
  6. char right;
  7. char up;
  8. char down;
  9. public Main() {
  10. super();
  11. front = ‘G‘;// 绿色
  12. back = ‘B‘;// 蓝色
  13. left = ‘O‘;// 橙色
  14. right = ‘R‘;// 红色
  15. up = ‘W‘;// 白色
  16. down = ‘Y‘;// 黄色
  17. }
  18. public void x() {
  19. char tmp = up;
  20. up = left;
  21. left = down;
  22. down = right;
  23. right = tmp;
  24. }
  25. public void y() {
  26. char tmp = up;
  27. up = front;
  28. front = down;
  29. down = back;
  30. back = tmp;
  31. }
  32. public void z() {
  33. char tmp = front;
  34. front = right;
  35. right = back;
  36. back = left;
  37. left = tmp;
  38. }
  39. public void print() {
  40. System.out.println(print(front) + print(right) + print(up));
  41. }
  42. public static String print(char c) {
  43. String color = null;
  44. switch (c) {
  45. case ‘G‘:
  46. color = "绿";
  47. break;
  48. case ‘B‘:
  49. color = "蓝";
  50. break;
  51. case ‘O‘:
  52. color = "橙";
  53. break;
  54. case ‘R‘:
  55. color = "红";
  56. break;
  57. case ‘W‘:
  58. color = "白";
  59. break;
  60. case ‘Y‘:
  61. color = "黄";
  62. break;
  63. default:
  64. break;
  65. }
  66. return color;
  67. }
  68. public static void main(String[] args) {
  69. Scanner sc = new Scanner(System.in);
  70. while (sc.hasNext()) {
  71. String op = sc.next();
  72. Main front[] = new Main[4];// 正面4个方块
  73. Main back[] = new Main[4];// 背面对应正面位置的4个方块
  74. for (int i = 0; i < 4; i++) {
  75. front[i] = new Main();
  76. back[i] = new Main();
  77. }
  78. for (int i = 0; i < op.length(); i++) {
  79. switch (op.charAt(i)) {
  80. case ‘x‘:
  81. for (int j = 0; j < 4; j++) {// 正面4个方块转动
  82. front[j].x();
  83. }
  84. Main tmp = front[0];
  85. front[0] = front[2];
  86. front[2] = front[3];
  87. front[3] = front[1];
  88. front[1] = tmp;
  89. break;
  90. case ‘y‘:
  91. for (int j = 1; j <= 3; j += 2) {// 右侧转动
  92. front[j].y();
  93. back[j].y();
  94. }
  95. Main tmp2 = front[1];
  96. front[1] = front[3];
  97. front[3] = back[3];
  98. back[3] = back[1];
  99. back[1] = tmp2;
  100. break;
  101. case ‘z‘:
  102. for (int j = 0; j <= 1; j++) {
  103. front[j].z();
  104. back[j].z();
  105. }
  106. Main tmp3 = back[0];
  107. back[0] = front[0];
  108. front[0] = front[1];
  109. front[1] = back[1];
  110. back[1] = tmp3;
  111. default:
  112. break;
  113. }
  114. }
  115. front[1].print();
  116. }
  117. }
  118. }
时间: 2025-01-01 07:42:46

[JAVA][2013蓝桥杯模拟赛 JAVA本科B组][第四题:二阶魔方]的相关文章

2016蓝桥杯省赛C/C++A组第八题 四平方和

题意: 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法. 要求你对4个数排序: 0 <= a <= b <= c <= d 并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法 程序

2016蓝桥杯省赛C/C++A组第六题 寒假作业

题意:现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ 每个方块代表1~13中的某一个数字,但不能重复. 比如: 6 + 7 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 以及: 7 + 6 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 就算两种解法.(加法,乘法交换律后算不同的方案) 你一共找到了多少种方案? 分析:回溯即可,但是如果等到cur==12

第八届蓝桥杯省赛C/C++ A组第8题 包子凑数

参考了http://blog.csdn.net/y1196645376/article/details/69718192 思路: 数论+完全背包. 实现: 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int MAXN = 100005; 6 7 int a[105], ok[MAXN], n; 8 9 int gcd(int x, int y) 10 { 11 return !

[JAVA][2013蓝桥杯预赛 JAVA本科B组][黄金连分数]

标题: 黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物, 其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了"近视眼"!! 言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法. 比较简单的一种是用连分数: 1 黄金数 = -------------------

[JAVA][2013蓝桥杯预赛 JAVA本科B组][错误票据]

标题:错误票据 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号. 你的任务是通过编程,找出断号的ID和重号的ID. 假设断号不可能发生在最大和最小号. 要求程序首先输入一个整数N(N<100)表示后面数据行数. 接着读入N行数据. 每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000) 每个整

[JAVA][2013蓝桥杯预赛 JAVA本科B组][振兴中华]

标题: 振兴中华 小明参加了学校的趣味运动会,其中的一个项目是:跳格子. 地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg) 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时,先站在左上角的写着"从"字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置.一直要跳到"华"字结束. 要求跳过的路线刚好构成"从我做起振兴中华"这句话. 请你帮助小明算一算他一共有多少种可能的跳跃路线呢? 答案是一个整数,

蓝桥杯模拟赛 猜算式

你一定还记得小学学习过的乘法计算过程,比如: 273x 15------ 1365 273------ 4095 请你观察如下的乘法算式 ***x ***-------- *** *** ***-------- ***** 星号代表某位数字,注意这些星号中,0~9中的每个数字都恰好用了2次.(如因字体而产生对齐问题,请参看图p1.jpg) 请写出这个式子最终计算的结果,就是那个5位数是多少? 注意:只需要填写一个整数,不要填写任何多余的内容.比如说明文字. 思路:DFS #include<std

蓝桥杯模拟赛-引爆炸弹-DFS+并查集

今天整理电脑,翻出来了很久以前大佬给的题,贴一下. 引爆炸弹 1000ms 在一个 n×m的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去. 现在为了引爆地图上的所有炸弹,需要手动引爆其中一些炸弹,为了把危险程度降到最低,请算出最少手动引爆多少个炸弹可以把地图上的所有炸弹引爆. 输入格式 第一行输两个整数 n,mn,mn,m,用空格隔开. 接下来 nnn 行,每行输入一个长度为 mmm 的字符串,表示地

蓝桥杯模拟赛 青出于蓝而胜于蓝

武当派一共有 nn 人,门派内 nn 人按照武功高低进行排名,武功最高的人排名第 11,次高的人排名第 22,... 武功最低的人排名第 nn.现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师父,每个人可能有多个徒弟. 我们知道,武当派人才辈出,连祖师爷的武功都只能排行到 pp.也就是说徒弟的武功是可能超过师父的,所谓的青出于蓝胜于蓝. 请你帮忙计算每个人的所有子弟(包括徒弟的徒弟,徒弟的徒弟的徒弟....)中,有多少人的武功超过了他自己. 输入格式 输入第一行两个整数 n, p