题解:2018校招真题(字节跳动:附加题)

题目链接:https://www.nowcoder.com/practice/9bbc4115e48b45239d6dcd2bf45f6926?tpId=90&tqId=30814&tPage=9&rp=9&ru=/ta/2018test&qru=/ta/2018test/question-ranking

题目描述

二阶魔方又叫小魔方,是2*2*2的立方形结构。每一面都有4个块,共有24个块。每次操作可以将任意一面逆时针或者顺时针旋转90°,如将上面逆时针旋转90°操作如下。

题解:2018校招真题(字节跳动:附加题)_第1张图片

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

魔方展开后每一块的序号如下图:

题解:2018校招真题(字节跳动:附加题)_第2张图片

输入描述:

输入一行包含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

这道题粗略一看很难,静下心来仔细想一想,就是写出转动的过程,然后用dfs进行遍历,求出最大值就行了。

#include 
//定义一个最小值
long max = -0x3fff;
//转动魔方
void swap(int a,int b,int c,int d,int arr[]){
    int temp = arr[a];
    arr[a]=arr[b];
    arr[b]=arr[c];
    arr[c]=arr[d];
    arr[d]=temp;
}
//右面的转动
void right(int arr[]){
    swap(1,7,17,21,arr);
    swap(3,13,19,23,arr);
    swap(8,14,15,9,arr);
}
void left(int arr[]){
    swap(0,6,16,20,arr);
    swap(2,12,18,22,arr);
    swap(11,10,4,5,arr);
}
void up(int arr[]){
    swap(4,6,8,23,arr);
    swap(5,7,9,22,arr);
    swap(0,2,3,1,arr);
}
void down(int arr[]){
    swap(10,12,14,21,arr);
    swap(11,13,15,20,arr);
    swap(16,17,19,18,arr);
}
void front(int arr[]){
    swap(5,3,14,16,arr);
    swap(11,2,8,17,arr);
    swap(6,7,13,12,arr);
}
void began(int arr[]){
    swap(0,9,19,10,arr);
    swap(1,15,18,4,arr);
    swap(21,20,22,23,arr);
}
//求当前形态下的完美值
long getSum(int arr[]){
    long sum = 0;
    sum += arr[0]*arr[1]*arr[2]*arr[3];
    sum += arr[4]*arr[5]*arr[10]*arr[11];
    sum += arr[6]*arr[7]*arr[12]*arr[13];
    sum += arr[8]*arr[9]*arr[14]*arr[15];
    sum += arr[16]*arr[17]*arr[18]*arr[19];
    sum += arr[20]*arr[21]*arr[22]*arr[23];
    return sum;
}
//dfs遍历
void dfs(int arr[],int depth){
    if(depth<0)
        return ;
    int sum = getSum(arr);
    if(max

 

你可能感兴趣的:(VC题解)