参考:牛客743990498号的题解
原java代码:https://www.nowcoder.com/practice/9bbc4115e48b45239d6dcd2bf45f6926?tpId=137&tqId=33881&rp=1&ru=%2Fta%2Fexam-bytedance&qru=%2Fta%2Fexam-bytedance%2Fquestion-ranking&tab=answerKey
题目描述
二阶魔方又叫小魔方,是222的立方形结构。每一面都有4个块,共有24个块。每次操作可以将任意一面逆时针或者顺时针旋转90°,如将上面逆时针旋转90°操作如下。
Nero在小魔方上做了一些改动,用数字替换每个块上面的颜色,称之为数字魔方。魔方上每一面的优美度就是这个面上4个数字的乘积,而魔方的总优美度就是6个面优美度总和。
现在Nero有一个数字魔方,他想知道这个魔方在操作不超过5次的前提下能达到的最大优美度是多少。
魔方展开后每一块的序号如下图:
输入描述:
输入一行包含24个数字,按序号顺序给出魔方每一块上面的数字。所有数大小范围为[-100,100]。
输出描述:
输出一行包含一个数字,表示最大优美度。
示例1
输入
2 -3 -2 3 7 -6 -6 -7 9 -5 -9 -3 -2 1 4 -9 -1 -10 -5 -5 -10 -4 8 2
输出
8281
# 就是穷举,没有什么算法
def calculate_beautiful_degree(cube: list):
return cube[0] * cube[1] * cube[2] * cube[3] + \
cube[4] * cube[5] * cube[10] * cube[11] + \
cube[6] * cube[7] * cube[12] * cube[13] + \
cube[8] * cube[9] * cube[14] * cube[15] + \
cube[16] * cube[17] * cube[18] * cube[19] + \
cube[20] * cube[21] * cube[22] * cube[23]
# 二阶魔方在某一刻按照优美度区分一共有6种旋转方式
record = [[0, 2, 6, 12, 16, 18, 20, 22, 4, 5, 11, 10],
[1, 3, 7, 13, 17, 19, 21, 23, 8, 14, 15, 9],
[4, 5, 6, 7, 8, 9, 23, 22, 0, 2, 3, 1],
[10, 11, 12, 13, 14, 15, 21, 20, 16, 17, 19, 18],
[0, 1, 9, 15, 19, 18, 10, 4, 20, 22, 23, 21],
[2, 3, 8, 14, 17, 16, 11, 5, 6, 7, 13, 12]]
def rotate(cube: list, r: list) -> list:
new_cube = cube.copy()
# 根据record变换魔方内的值
temp = new_cube[r[6]]
for i in range(4, -2, -2):
new_cube[r[i + 2]] = new_cube[r[i]]
new_cube[r[0]] = temp
temp = new_cube[r[7]]
for i in range(5, 0, -2):
new_cube[r[i + 2]] = new_cube[r[i]]
new_cube[r[1]] = temp
temp = new_cube[r[11]]
for i in range(10, 7, -1):
new_cube[r[i + 1]] = new_cube[r[i]]
new_cube[r[8]] = temp
return new_cube
def turn(cube: list, remain: int):
result = calculate_beautiful_degree(cube)
if remain == 0:
return calculate_beautiful_degree(cube)
global record
for r in record:
new_cube = rotate(cube, r)
# 使用新魔方进行remain - 1次旋转
temp = turn(new_cube, remain - 1)
# 取最大优美度
if temp > result:
result = temp
# 返回最大优美度
return result
arr = [i for i in map(int, input().split())]
print(turn(arr, 5))