题目链接:点击这里
初步思路
遇见立方体的题总是没太好的思路,但此题题目比较简单,最暴力的方法就是直接枚举,毕竟也只有6个面,立方体最多也只有4个。但如何枚举呢?我们注意到,一个立方体不管如何旋转,相对应的面总是不变的。因此,我最开始的思路就是确定哪些面是相对应的,然后再进一步操作。但仅仅确定三个面是不够的,可以自己画一下图,有些情况是依然没有办法通过旋转得到的。因此,我们需要先知道到底旋转能产生多少种姿态。
如下图所示,我们可以这样给立方体的每个面进行标号,然后按照这个顺序形成排列。
可以发现,我们首先从1-6个面中选择一个作为顶面,再在剩下的4个面中选择一个作为正面,其他面就可以唯一确定了。因此,一共有 6×4=24 6 × 4 = 24 种排列。
如何得到这24种排列呢?最容易想到的就是在草稿纸上画一画,然后直接将结果写入数组。但这样子做不利于维持程序的健壮性和可读性。因此,本文参考了书上的方法。
思路总结
得到旋转排列
我们首先将标准姿势进行左旋,不难得到对应的排列为{5,1,3,4,6,2}。
将标准姿势进行上翻,得到对应的排列为{3,2,6,1,5,4}。注意,这里的数字表示的是第i个颜色所处的面,例如,color1对应的左旋后的面为5。
我们也可以得到将标准姿势进行左旋,然后上翻后得到的排列,可以发现旋转是可以组合的。例如,color1对应的左旋后的面为5,在上翻的排列中,下标为5对应的面是5。依次组合可得,先左旋后上翻后得到的排列为{5,3,6,1,4,2}。
很自然的可以想到,我们是否可以将所有24种姿势都归纳为左旋和上翻的组合呢?
1在顶面的姿态:向上翻转1次,然后向左翻转0~3次。
2在顶面的姿态:向左转1次,向上翻转1次,然后向左翻转0~3次。
3在顶面的姿态:向左翻转0~3次。
4在顶面的姿态:向上翻转2次,然后向左翻转0~3次。
5在顶面的姿态:向左翻转3次,向上翻转1次,然后向左翻转0~3次。
6在顶面的姿态:向左翻转2次,向上翻转1次,然后向左翻转0~3次。
这样,我们就可以得到所有24种姿态(排列)。
如何暴力枚举
一种方法是枚举最后那个”大家都相同的立方体“的每个面是什么,然后对于每个立方体,看看哪种姿态需要重新涂色的面最少。但由于4个立方体最多可能会有24种不同的颜色,最多需要枚举