首页 > 试题广场 >

附加题

[编程题]附加题
  • 热度指数:1879 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
二阶魔方又叫小魔方,是2*2*2的立方形结构。每一面都有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
思路比较直接,就是递归枚举所有旋转魔方的方式,并找到最大的优美度
s = list(map(int, input().split())) # 旋转时只需考虑旋转三个面,旋转剩下三面等价于反向旋转对立面
f = [6,7,13,12,2,3,8,14,17,16,11,5] # 旋转正面要用到的index
t = [0,1,3,2,22,23,9,8,7,6,5,4] # 旋转上面要用到的index
r = [8,9,15,14,3,1,23,21,19,17,13,7] # 旋转右面要用到的index

def calculate(s): # 计算魔方s当前的优美度
    res =  s[0]*s[1]*s[2]*s[3]
    res += s[4]*s[5]*s[10]*s[11]
    res += s[6]*s[7]*s[12]*s[13]
    res += s[8]*s[9]*s[14]*s[15]
    res += s[16]*s[17]*s[18]*s[19]
    res += s[20]*s[21]*s[22]*s[23]
    return res

def turn(s, z, direction): # s为当前魔方,z为(f,t,r)之一,direction=1表示顺时针
    x = z[:]
    s_tmp = s[:]
    if direction == 1: # 顺时针旋转
        x[0],x[1],x[2],x[3] = x[3],x[0],x[1],x[2]
        x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11] = x[10],x[11],x[4],x[5],x[6],x[7],x[8],x[9]
    else: # 逆时针旋转
        x[0],x[1],x[2],x[3] = x[1],x[2],x[3],x[0]
        x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11] = x[6],x[7],x[8],x[9],x[10],x[11],x[4],x[5]
    for i in range(12):
        s_tmp[z[i]] = s[x[i]] # 更新tmp
    return s_tmp # 输出旋转后的魔方

def iter(s, cnt):
    global res
    tmp = calculate(s) # 计算当前优美度并更新res
    if tmp > res: 
        res = tmp
    if cnt == 0: return
    iter(turn(s,f,1), cnt-1) # 旋转正面
    iter(turn(s,f,-1), cnt-1)
    iter(turn(s,t,1), cnt-1) # 旋转上面
    iter(turn(s,t,-1), cnt-1)
    iter(turn(s,r,1), cnt-1) # 旋转右面
    iter(turn(s,r,-1), cnt-1)

res = float('-inf')
iter(s,5)
print(res)
发表于 2022-02-24 20:23:01 回复(0)