网易的算法高手GG写给MM的魔方
题目描述:
据说,网易有自主开发的游戏引擎,参与开发的个个都是算法高手,喜欢研究各种好玩的东西。
有一天,有个小mm得到了一个魔方,不过魔方不是常规的3*3*3的!
而是大小是2*2*3的一个长方体!她实在搞不定这种异形魔方,
于是只好求助于引擎部某GG。那GG看到后说,这太简单了,等我一会儿。
没多久,程序写好后,一下子就把小mm需要的公式算出来了,
那个mm惊叹不已,并用这些公式迅速把魔方还原好了。让小mm佩服的不得了。
你的算法能力怎么样呢?你也能办到吗?
输入:
魔方摆放例图(并且假设颜色分布为上黄下白左蓝右绿前红后橙):
2 3
1 0
10 11
9 8
6 7
5 4
请你编写函数:
int solve(const int m[], const int s[], char ans[])
参数意义如下:
m[] : 例图中的是位置编号,也是复原后的方块编号;
m[a] = b 表示在位置a的地方,放了一个编号为b的方块
m这个数组的长度为12
s[] : 用来表示每一块主色的朝向,黄白为主色,没有前两色时以红橙为主色;
主色面向上为0,向下为1,左为2,右为3,前为4,后为5
如附图sample,U面上各块,主色都面向上,朝向值为0
中层RF块,橙色面朝右,值为3。s这个数组的长度为12
输出:
ans[]:返回复原(只需要各面同色)的最少的操作步骤,写法类似魔方公式:
UDLRFB分别表示相应面,单独写一个字母表示这个面顺时针旋转90度,
R2表示R面旋转180度,U'表示U面逆时针旋转90度。
U的旋转方向是0->1->2->3,U'是0->3->2->1
D的旋转方向是4->7->6->5,D'是4->5->6->7
R2只算一步,步数以这6个字母的出现次数为准,之间不要用空格分隔
函数返回值:返回还原的最少步数,要与ans里的步数一致。
样例输入:
m= 3 2 4 5 0 1 7 6 9 11 10 8 s= 0 0 0 0 1 1 1 1 4 4 5 5
样例输出:
4 DUF2R2
其它信息:
输出的如4 DUF2R2,4表示返回值,返回值的答案唯一
DUF2R2为ans数组中的内容,ans中的内容不唯一,只要是任意一解即可