题目链接: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°操作如下。
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
这道题粗略一看很难,静下心来仔细想一想,就是写出转动的过程,然后用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