2021-03-28

参考:牛客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°操作如下。
2021-03-28

Nero在小魔方上做了一些改动,用数字替换每个块上面的颜色,称之为数字魔方。魔方上每一面的优美度就是这个面上4个数字的乘积,而魔方的总优美度就是6个面优美度总和。
现在Nero有一个数字魔方,他想知道这个魔方在操作不超过5次的前提下能达到的最大优美度是多少。
魔方展开后每一块的序号如下图:
2021-03-28

输入描述:
输入一行包含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))

上一篇:博客园魔方 放到后台页首


下一篇:Kylin的概述与架构