现在Nero有一个数字魔方,他想知道这个魔方在操作不超过5次的前提下能达到的最大优美度是多少。
输入一行包含24个数字,按序号顺序给出魔方每一块上面的数字。所有数大小范围为[-100,100]。
输出一行包含一个数字,表示最大优美度。
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
import java.util.*;
import java.io.*;
public class Main {
public static void main (String[] args) {
record = new ArrayList<>();
//魔方共有6种旋转方式。(逆时针旋转魔方的面朝你的一半等同于顺时针旋转魔方后侧的一半)
//旋转一次发生两种变化,以上图为例:
//假设面朝4,5,10,11,将面前的平面逆时针旋转90度
//0,2,6,12,16,18,20,22编号的8个数字交换位置,结束后新的位置为6,12,16,18,20,22,0,2
//4,5,11,10编号的4个数字变换位置,结束后新的位置为5,11,10,4
//record里第一个int[]用于记录此次旋转会改变的所有数字
//之后每个int[]各记录旋转一个平面后将改变的数字且遵从刚才的数字空间排列顺序
record.add(new int[] {0,2,6,12,16,18,20,22,4,5,11,10});
record.add(new int[] {1,3,7,13,17,19,21,23,8,14,15,9});
record.add(new int[] {4,5,6,7,8,9,23,22,0,2,3,1});
record.add(new int[] {10,11,12,13,14,15,21,20,16,17,19,18});
record.add(new int[] {0,1,9,15,19,18,10,4,20,22,23,21});
record.add(new int[] {2,3,8,14,17,16,11,5,6,7,13,12});
Scanner s = new Scanner(System.in);
String[] str_arr = s.nextLine().split(" ");
int[] arr = new int[str_arr.length];
for (int i=0; i<str_arr.length; i++) {
arr[i] = Integer.parseInt(str_arr[i]);
}
//arr是初始魔方
System.out.println(turn(arr, 5));
}
//l为魔方本身, remain为剩余旋转次数, 返回最多旋转remain次魔方的最大优美度
private static int turn (int[] l, int remain) {
//不可再旋转,返回当前优美度即可
if (remain==0) {
return mult(l);
}
int result = -99999;
int temp;
for (int[] r:record) {
int[] n = l.clone();
//根据record变换魔方内的值
temp = n[r[6]];
for (int i=4; i>=0; i-=2) {
n[r[i+2]] = n[r[i]];
}
n[r[0]] = temp;
temp = n[r[7]];
for (int i=5; i>=1; i-=2) {
n[r[i+2]] = n[r[i]];
}
n[r[1]] = temp;
temp = n[r[11]];
for (int i=10; i>=8; i--) {
n[r[i+1]] = n[r[i]];
}
n[r[8]] = temp;
//使用新魔方进行remain-1次旋转
temp = turn(n, remain-1);
//取最大优美度
if (temp>result) result = temp;
}
//返回最大优美度
return Math.max(mult(l),result);
}
//计算单个魔方优美度
private static int mult (int[] l) {
return l[0]*l[1]*l[2]*l[3]+l[4]*l[5]*l[10]*l[11]+l[6]*l[7]*l[12]*l[13]+l[8]*l[9]*l[14]*l[15]
+l[16]*l[17]*l[18]*l[19]+l[20]*l[21]*l[22]*l[23];
}
private static List<int[]> record;
} #include <bits/stdc++.h>
using namespace std;
vector<int> cube(24);
int res;
//正面
int b[6][8] = {{2,3,8,14,17,16,11,5},
{0,1,9,15,19,18,10,4},
{1,3,7,13,17,19,21,23},
{0,2,6,12,16,18,20,22},
{4,5,6,7,8,9,23,22},
{10,11,12,13,14,15,21,20}
};
//对应侧面
int c[6][4] = {
{6, 7, 13, 12},
{22, 23, 21, 20},
{9, 8, 14, 15},
{4, 5, 11, 10},
{2, 3, 1, 0},
{16, 17, 19, 18}
};
//计算取值
int get_sum(vector<int>& a) {
return a[0] * a[1] * a[2] * a[3] +
a[4] * a[5] * a[10] * a[11] +
a[6] * a[7] * a[12] * a[13] +
a[8] * a[9] * a[14] * a[15] +
a[16] * a[17] * a[18] * a[19] +
a[20] * a[21] * a[22] * a[23];
}
//旋转
void shift(int i, int k, vector<int> &t) {
//侧面8个,转一面移动2
int l1 = t[b[i][6]], l2 = t[b[i][7]];
for(int j = 7; j - 2 >= 0; --j) t[b[i][j]] = t[b[i][j - 2]];
t[b[i][0]] = l1, t[b[i][1]] = l2;
//正面4个,转一面移动1
vector<int> pos(4);
for(int j = 0; j < 4; ++j) pos[j] = c[i][j];
int last = t[pos[3]];
for(int j = 3; j >= 1; --j) t[pos[j]] = t[pos[j - 1]];
t[pos[0]] = last;
}
void dfs(int k, vector<int> t) {
if(k == 0) {
return;
}
for(int i = 0; i < 6; ++i) {
auto cur = t;
shift(i, 2, cur);
res = max(get_sum(cur), res);
dfs(k - 1, cur);
}
}
int main() {
for(int i = 0; i < 24; ++i) cin >> cube[i];
res = get_sum(cube);
dfs(5, cube);
cout << res;
return 0;
} 1.转动5次以内(少于5次也可以,每次都要计算取值),每次值传递避免污染#include<bits/stdc++.h>
using namespace std;
void top(vector<int>&vec){
int temp=vec[0];
vec[0]=vec[1];
vec[1]=vec[3];
vec[3]=vec[2];
vec[2]=temp;
int temp1=vec[8];
int temp2=vec[9];
vec[8]=vec[6];
vec[9]=vec[7];
vec[6]=vec[4];
vec[7]=vec[5];
vec[4]=vec[23];
vec[5]=vec[22];
vec[23]=temp1;
vec[22]=temp2;
}
void right(vector<int>&vec){
int temp=vec[8];
vec[8]=vec[9];
vec[9]=vec[15];
vec[15]=vec[14];
vec[14]=temp;
int temp1=vec[21];
int temp2=vec[23];
vec[21]=vec[17];
vec[23]=vec[19];
vec[17]=vec[7];
vec[19]=vec[13];
vec[7]=vec[1];
vec[13]=vec[3];
vec[1]=temp1;
vec[3]=temp2;
}
void front(vector<int>&vec){
int temp=vec[6];
vec[6]=vec[7];
vec[7]=vec[13];
vec[13]=vec[12];
vec[12]=temp;
int temp1=vec[2];
int temp2=vec[3];
vec[2]=vec[8];
vec[3]=vec[14];
vec[8]=vec[17];
vec[14]=vec[16];
vec[17]=vec[11];
vec[16]=vec[5];
vec[11]=temp1;
vec[5]=temp2;
}
long long getVal(const vector<int>&vec){
return
vec[0]*vec[1]*vec[2]*vec[3]+
vec[4]*vec[5]*vec[10]*vec[11]+
vec[6]*vec[7]*vec[12]*vec[13]+
vec[8]*vec[9]*vec[14]*vec[15]+
vec[16]*vec[17]*vec[18]*vec[19]+
vec[20]*vec[21]*vec[22]*vec[23];
}
long long getmax(vector<int> vec,int count,int way){
if(count==0) return getVal(vec);
switch(way){
case 1: top(vec);break;
case 2: top(vec);top(vec);top(vec);break;
case 3: right(vec);break;
case 4: right(vec);right(vec);right(vec);break;
case 5: front(vec);break;
case 6: front(vec);front(vec);front(vec);break;
default:break;
}
long long maxval=getmax(vec,count-1,1);
maxval=max(maxval, getmax(vec,count-1,2));
maxval=max(maxval, getmax(vec,count-1,3));
maxval=max(maxval, getmax(vec,count-1,4));
maxval=max(maxval, getmax(vec,count-1,5));
maxval=max(maxval, getmax(vec,count-1,6));
return maxval;
}
int main(){
int size=24;
vector<int> vec(size);
for(int i=0;i<size;i++){
cin>>vec[i];
}
cout<<getmax(vec,6,0)<<endl;
return 0;
} cubeArray = list(map(int,input().strip().split())) def rotation_circle(cubeArray,opNum): if opNum==1: cubeArray_index_2 = cubeArray[2] cubeArray_index_3 = cubeArray[3] cubeArray[2] = cubeArray[8] cubeArray[3] = cubeArray[14] cubeArray[8] = cubeArray[17] cubeArray[14] = cubeArray[16] cubeArray[16] = cubeArray[5] cubeArray[17] = cubeArray[11] cubeArray[5] = cubeArray_index_3 cubeArray[11] =cubeArray_index_2 cubeArray_index_6 = cubeArray[6] cubeArray[6] = cubeArray[7] cubeArray[7] = cubeArray[13] cubeArray[13] = cubeArray[12] cubeArray[12] = cubeArray_index_6 else: cubeArray_index_0 = cubeArray[0] cubeArray_index_1 = cubeArray[1] cubeArray[0] = cubeArray[9] cubeArray[1] = cubeArray[15] cubeArray[9] = cubeArray[19] cubeArray[15] = cubeArray[18] cubeArray[19] = cubeArray[10] cubeArray[18] = cubeArray[4] cubeArray[4] = cubeArray_index_1 cubeArray[10] = cubeArray_index_0 cubeArray_index_22 = cubeArray[22] cubeArray[22] = cubeArray[23] cubeArray[23] = cubeArray[21] cubeArray[21] = cubeArray[20] cubeArray[20] = cubeArray_index_22 return cubeArray def rotation_left_right(cubeArray,opNum): if opNum==1: cubeArray_index_23 = cubeArray[23] cubeArray_index_22 = cubeArray[22] cubeArray[23] = cubeArray[8] cubeArray[22] = cubeArray[9] cubeArray[8] = cubeArray[6] cubeArray[9] = cubeArray[7] cubeArray[6] = cubeArray[4] cubeArray[7] = cubeArray[5] cubeArray[4] = cubeArray_index_23 cubeArray[5] =cubeArray_index_22 cubeArray_index_3 = cubeArray[3] cubeArray[3] = cubeArray[2] cubeArray[2] = cubeArray[0] cubeArray[0] = cubeArray[1] cubeArray[1] = cubeArray_index_3 else: cubeArray_index_21 = cubeArray[21] cubeArray_index_20 = cubeArray[20] cubeArray[21] = cubeArray[14] cubeArray[20] = cubeArray[15] cubeArray[14] = cubeArray[12] cubeArray[15] = cubeArray[13] cubeArray[12] = cubeArray[10] cubeArray[13] = cubeArray[11] cubeArray[10] = cubeArray_index_21 cubeArray[11] = cubeArray_index_20 cubeArray_index_18 = cubeArray[18] cubeArray[18] = cubeArray[19] cubeArray[19] = cubeArray[17] cubeArray[17] = cubeArray[16] cubeArray[16] = cubeArray_index_18 return cubeArray def rotation_up_down(cubeArray,opNum): if opNum==1: cubeArray_index_21 = cubeArray[21] cubeArray_index_23 = cubeArray[23] cubeArray[21] = cubeArray[17] cubeArray[23] = cubeArray[19] cubeArray[17] = cubeArray[7] cubeArray[19] = cubeArray[13] cubeArray[7] = cubeArray[1] cubeArray[13] = cubeArray[3] cubeArray[1] = cubeArray_index_21 cubeArray[3] =cubeArray_index_23 cubeArray_index_14 = cubeArray[14] cubeArray[14] = cubeArray[8] cubeArray[8] = cubeArray[9] cubeArray[9] = cubeArray[15] cubeArray[15] = cubeArray_index_14 else: cubeArray_index_20 = cubeArray[20] cubeArray_index_22 = cubeArray[22] cubeArray[20] = cubeArray[16] cubeArray[22] = cubeArray[18] cubeArray[16] = cubeArray[6] cubeArray[18] = cubeArray[12] cubeArray[6] = cubeArray[0] cubeArray[12] = cubeArray[2] cubeArray[0] = cubeArray_index_20 cubeArray[2] = cubeArray_index_22 cubeArray_index_4 = cubeArray[4] cubeArray[4] = cubeArray[10] cubeArray[10] = cubeArray[11] cubeArray[11] = cubeArray[5] cubeArray[5] = cubeArray_index_4 return cubeArray def sum_caculation(cubeArray): sumArray = 0 sumArray += cubeArray[0]*cubeArray[1]*cubeArray[2]*cubeArray[3] sumArray += cubeArray[4] * cubeArray[5] * cubeArray[10] * cubeArray[11] sumArray += cubeArray[6] * cubeArray[7] * cubeArray[12] * cubeArray[13] sumArray += cubeArray[8] * cubeArray[9] * cubeArray[14] * cubeArray[15] sumArray += cubeArray[16] * cubeArray[17] * cubeArray[18] * cubeArray[19] sumArray += cubeArray[20] * cubeArray[21] * cubeArray[22] * cubeArray[23] return sumArray def rotation_judgement(j,cubeArray,maxSum): if j ==0: cubeArray = rotation_circle(cubeArray,1) maxSum = max(maxSum,sum_caculation(cubeArray)) elif j==1: cubeArray = rotation_circle(cubeArray, 2) maxSum = max(maxSum, sum_caculation(cubeArray)) elif j==2: cubeArray = rotation_circle(cubeArray, 1) cubeArray = rotation_circle(cubeArray, 1) cubeArray = rotation_circle(cubeArray, 1) maxSum = max(maxSum, sum_caculation(cubeArray)) elif j==3: cubeArray = rotation_circle(cubeArray, 2) cubeArray = rotation_circle(cubeArray, 2) cubeArray = rotation_circle(cubeArray, 2) maxSum = max(maxSum, sum_caculation(cubeArray)) elif j==4: cubeArray = rotation_left_right(cubeArray, 1) maxSum = max(maxSum, sum_caculation(cubeArray)) elif j==5: cubeArray = rotation_left_right(cubeArray, 2) maxSum = max(maxSum, sum_caculation(cubeArray)) elif j==6: cubeArray = rotation_left_right(cubeArray, 1) cubeArray = rotation_left_right(cubeArray, 1) cubeArray = rotation_left_right(cubeArray, 1) maxSum = max(maxSum, sum_caculation(cubeArray)) elif j==7: cubeArray = rotation_left_right(cubeArray, 2) cubeArray = rotation_left_right(cubeArray, 2) cubeArray = rotation_left_right(cubeArray, 2) maxSum = max(maxSum, sum_caculation(cubeArray)) elif j==8: cubeArray = rotation_up_down(cubeArray, 1) maxSum = max(maxSum, sum_caculation(cubeArray)) elif j==9: cubeArray = rotation_up_down(cubeArray, 2) maxSum = max(maxSum, sum_caculation(cubeArray)) elif j==10: cubeArray = rotation_up_down(cubeArray, 1) cubeArray = rotation_up_down(cubeArray, 1) cubeArray = rotation_up_down(cubeArray, 1) maxSum = max(maxSum, sum_caculation(cubeArray)) else: cubeArray = rotation_up_down(cubeArray, 2) cubeArray = rotation_up_down(cubeArray, 2) cubeArray = rotation_up_down(cubeArray, 2) maxSum = max(maxSum, sum_caculation(cubeArray)) return cubeArray,maxSum maxSum = -100*100*100*100*6-1 cubeArray1 = cubeArray[:] for i in range(12): cubeArray = cubeArray1[:] cubeArray,maxSum = rotation_judgement(i,cubeArray,maxSum) cubeArray2 = cubeArray[:] for j in range(12): cubeArray = cubeArray2[:] cubeArray, maxSum = rotation_judgement(j, cubeArray, maxSum) cubeArray3 = cubeArray[:] for k in range(12): cubeArray = cubeArray3[:] cubeArray, maxSum = rotation_judgement(k, cubeArray, maxSum) cubeArray4 = cubeArray[:] for l in range(12): cubeArray = cubeArray4[:] cubeArray, maxSum = rotation_judgement(l, cubeArray, maxSum) cubeArray5 = cubeArray[:] for q in range(12): cubeArray = cubeArray5[:] cubeArray, maxSum = rotation_judgement(q, cubeArray, maxSum) print(maxSum)
'''
横向旋转为X轴,竖向为Y,否则为Z
class Mofang(object) :
def __init__(self,list) :
self.list = list
def move(self,revolve_dir = 'X',times = 1) :
for i in range(0,times) :
if revolve_dir == 'X' :
l = [1,3,5,7,9,11,13,15]
for i in l :
if i == 1 :
tmp_1 = self.list[i]
elif i == 3 :
tmp_3 = self.list[i]
else :
self.list[i-4] = self.list[i]
self.list[13] = tmp_1
self.list[15] = tmp_3
tmp = self.list[20]
self.list[20] = self.list[22]
self.list[22] = self.list[23]
self.list[23] = self.list[21]
self.list[21] = tmp
elif revolve_dir == 'Y' :
self.list[16],self.list[17] ,self.list[4],self.list[5] = self.list[4],self.list[5],self.list[16],self.list[17]
self.list[14],self.list[15],self.list[4],self.list[5] = self.list[4],self.list[5],self.list[14],self.list[15]
self.list[20],self.list[21],self.list[4],self.list[5] = self.list[4],self.list[5],self.list[20],self.list[21]
tmp = self.list[0]
self.list[0] = self.list[2]
self.list[2] = self.list[3]
self.list[3] = self.list[1]
self.list[1] = tmp
else :
self.list[20],self.list[21] ,self.list[8],self.list[9] = self.list[8],self.list[9],self.list[20],self.list[21]
self.list[2],self.list[3],self.list[8],self.list[9] = self.list[8],self.list[9],self.list[2],self.list[3]
self.list[17],self.list[19],self.list[8],self.list[9] = self.list[8],self.list[9],self.list[17],self.list[19]
tmp = self.list[4]
self.list[4] = self.list[5]
self.list[5] = self.list[7]
self.list[7] = self.list[6]
self.list[6] = tmp
return self.list
def __str__(self) :
s = '''
--------
| {0} | {1} |
--------
| {2} | {3} |
--------------------------
| {16} | {17} | {4} | {5} | {20} | {21}|
----|---------------|-----
| {18} | {19} | {6} | {7} | {22} | {23}|
--------------------------
| {8} | {9}|
--------
| {10} |{11}|
--------
| {12} | {13} |
--------
| {14} | {15}|
--------
'''.format(self.list[0],self.list[1],self.list[2],self.list[3],self.list[4],self.list[5],self.list[6],self.list[7],self.list[8],self.list[9],self.list[10],self.list[11],self.list[12],self.list[13],self.list[14],self.list[15],self.list[16],self.list[17],self.list[18],self.list[19],self.list[20],self.list[21],self.list[22],self.list[23])
return s
if __name__ == '__main__' :
m = Mofang([20, 1, 22, 3, 10, 4, 0, 7, 8, 9, 11, 5, 2, 13, 14, 15, 6, 17, 12, 19, 16, 21, 18, 23])
print m
m.move('Y', 1)
print m
m.move('Z', 1)
m.move('X', 1)
print (m)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = 24;
int[] nore = new int[24];
int i =0;
while(n-- > 0 && scanner.hasNextInt()) {
nore[i++] = scanner.nextInt();
}
System.out.println(caculate(nore , 5));
}
private static int caculate(int[] nore, int k) {
int ans = nore[0] * nore[1] * nore[2]* nore[3];
ans += nore[4] * nore[5] * nore[10]* nore[11];
ans += nore[6] * nore[7] * nore[12]* nore[13];
ans += nore[8] * nore[9] * nore[14]* nore[15];
ans += nore[16] * nore[17] * nore[18]* nore[19];
ans += nore[20] * nore[21] * nore[22]* nore[23];
if(k == 0) {
return ans;
}
//逆时针旋转上面 8-2 14-3 2-11 3-5 11-17 5-16 17-8 16-14
ans = Math.max(caculate(transform(nore , 2 , 8, 17 , 11 , 3 , 14 , 16 , 5 , 6 , 7 , 13 , 12 ) , k-1) , ans);
//顺时针旋转上面
ans = Math.max(caculate(transform(nore , 11, 17, 8, 2 , 5 , 16,14,3 , 12 , 13 , 7 , 6) , k-1) , ans);
//旋转前面
ans = Math.max(caculate(transform(nore , 1 , 7 , 17 , 21, 3 , 13, 19 ,23 , 8 , 14 , 15 , 9) , k-1) , ans);
ans = Math.max(caculate(transform(nore , 21 , 17,7, 1, 23, 19, 13, 3 , 9 , 15 , 14 , 8) , k-1) , ans);
//旋转右面
ans = Math.max(caculate(transform(nore , 15,13,11 ,20 , 14 , 12, 10 ,21 , 16 , 18 , 19, 17) , k-1) , ans);
ans = Math.max(caculate(transform(nore , 20 , 11 , 13 ,15 ,21, 10 ,12,14 , 17 , 19 , 18 , 16) , k-1) , ans);
return ans;
}
//旋转一次
static int[] transform(int[] nore , int n1, int n2 ,int n3 ,int n4 ,int n5 , int n6 , int n7 , int n8 , int n9 , int n10 , int n11 , int n12) {
int[] ans = Arrays.copyOf(nore, 24);
ans[n1] = nore[n2];
ans[n2] = nore[n3];
ans[n3] = nore[n4];
ans[n4] = nore[n1];
ans[n5] = nore[n6];
ans[n6] = nore[n7];
ans[n7] = nore[n8];
ans[n8] = nore[n5];
ans[n9] = nore[n10];
ans[n10] = nore[n11];
ans[n11] = nore[n12];
ans[n12] = nore[n9];
return ans;
}
} package main
import "fmt"
func beauty(nums []int) int {
total := 0
total += nums[0]*nums[1]*nums[2]*nums[3]
total += nums[4]*nums[5]*nums[10]*nums[11]
total += nums[6]*nums[7]*nums[12]*nums[13]
total += nums[8]*nums[9]*nums[14]*nums[15]
total += nums[16]*nums[17]*nums[18]*nums[19]
total += nums[20]*nums[21]*nums[22]*nums[23]
return total
}
func top1(nums []int) {
nums[2], nums[3], nums[8], nums[14], nums[17], nums[16], nums[11], nums[5] =
nums[8], nums[14], nums[17], nums[16], nums[11], nums[5], nums[2], nums[3]
nums[6], nums[7], nums[13], nums[12] = nums[7], nums[13], nums[12], nums[6]
}
func top2(nums []int) {
nums[8], nums[14], nums[17], nums[16], nums[11], nums[5], nums[2], nums[3] =
nums[2], nums[3], nums[8], nums[14], nums[17], nums[16], nums[11], nums[5]
nums[7], nums[13], nums[12], nums[6] = nums[6], nums[7], nums[13], nums[12]
}
func front1(nums []int) {
nums[12], nums[13], nums[14], nums[15], nums[21], nums[20], nums[10], nums[11] =
nums[14], nums[15], nums[21], nums[20], nums[10], nums[11], nums[12], nums[13]
nums[16], nums[17], nums[19], nums[18] = nums[17], nums[19], nums[18], nums[16]
}
func front2(nums []int) {
nums[14], nums[15], nums[21], nums[20], nums[10], nums[11], nums[12], nums[13] =
nums[12], nums[13], nums[14], nums[15], nums[21], nums[20], nums[10], nums[11]
nums[17], nums[19], nums[18], nums[16] = nums[16], nums[17], nums[19], nums[18]
}
func right1(nums []int) {
nums[3], nums[1], nums[23], nums[21], nums[19], nums[17], nums[13], nums[7] =
nums[23], nums[21], nums[19], nums[17], nums[13], nums[7], nums[3], nums[1]
nums[8], nums[9], nums[15], nums[14] = nums[9], nums[15], nums[14], nums[8]
}
func right2(nums []int) {
nums[3], nums[1], nums[23], nums[21], nums[19], nums[17], nums[13], nums[7] =
nums[23], nums[21], nums[19], nums[17], nums[13], nums[7], nums[3], nums[1]
nums[8], nums[9], nums[15], nums[14] = nums[9], nums[15], nums[14], nums[8]
}
func biggest(nums []int) int {
var max int
backtrack(nums, 5, &max)
return max
}
func backtrack(nums []int, leftStep int, max *int) {
if cur := beauty(nums); cur > *max {
*max = beauty(nums)
}
if leftStep == 0 {
return
}
top1(nums)
backtrack(nums, leftStep-1, max)
top2(nums)
top2(nums)
backtrack(nums, leftStep-1, max)
top1(nums)
front1(nums)
backtrack(nums, leftStep-1, max)
front2(nums)
front2(nums)
backtrack(nums, leftStep-1, max)
front1(nums)
right1(nums)
backtrack(nums, leftStep-1, max)
right2(nums)
right2(nums)
backtrack(nums, leftStep-1, max)
right1(nums)
}
func main() {
nums := make([]int, 24)
for i:=0; i<24; i++ {
fmt.Scanf("%d", &nums[i])
}
fmt.Println(biggest(nums))
} #include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int mp[6][24] = {
// {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23},
{1,3,0,2,23,22,4,5,6,7,10,11,12,13,14,15,16,17,18,19,20,21,9,8},
{0,1,2,3,4,5,6,7,8,9,21,20,10,11,12,13,18,16,19,17,15,14,22,23},
{20,1,22,3,10,4,0,7,8,9,11,5,2,13,14,15,6,17,12,19,16,21,18,23},
{0,21,2,23,4,5,6,1,9,15,10,11,12,3,8,14,16,7,18,13,20,17,22,19},
{0,1,11,5,4,16,12,6,2,9,10,17,13,7,3,15,14,8,18,19,20,21,22,23},
{10,4,2,3,18,5,6,7,8,0,19,11,12,13,14,1,16,17,15,9,21,23,20,22},
};
int addSum(vector<int>& nums) {
int a1 = nums[0] * nums[1] * nums[2] * nums[3];
int a2 = nums[4] * nums[5] * nums[10] * nums[11];
int a3 = nums[6] * nums[7] * nums[12] * nums[13];
int a4 = nums[8] * nums[9] * nums[14] * nums[15];
int a5 = nums[16] * nums[17] * nums[18] * nums[19];
int a6 = nums[20] * nums[21] * nums[22] * nums[23];
int sum = a1 + a2 + a3 + a4 + a5 + a6;
return sum;
}
void flip(vector<int>& nums, int ind) {
vector<int> temp = nums;
for (int i = 0;i < 24;i++) {
nums[i] = temp[mp[ind][i]];
}
}
void dfs(vector<int>& nums, int depth, int& maxValue) {
int sum = addSum(nums);
maxValue = max(maxValue, sum);
if (depth == 5) {
return;
}
for (int i = 0;i < 6;i++) {
flip(nums, i);
depth++;
dfs(nums,depth, maxValue);
flip(nums, i);
flip(nums, i);
flip(nums, i);
depth--;
}
}
int main() {
vector<int> nums(24, 0);
for (int i = 0;i < 24;i++) {
cin >> nums[i];
}
int maxValue = 1 >> 20;
dfs(nums, 0, maxValue);
cout << maxValue << endl;
system("pause");
} 采用回溯法,算个上5步都不操作,绕三个轴的顺逆时针操作一共有7中旋转方法,一共有5步,每一步都有7种选择,递归每一种选择的结果。主要卡再魔方的旋转上面,采用暴力法把每一种旋转处理掉。
#include <stdio.h>
enum
{
NO_ROATE = 0,
X_CLOCKWISE,
X_COUNTERCLOCKWISE,
Y_CLOCKWISE,
Y_COUNTERCLOCKWISE,
Z_CLOCKWISE,
Z_COUNTERCLOCKWISE,
};
int beautful_degree(int cube_num[6][4])
{
int total = 0;
int p = 1;
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 4; j++)
{
p = p * cube_num[i][j];
}
total += p;
p = 1;
}
//printf("total = %d\n", total);
return total;
}
void cube_roate(int cube_num[6][4], int dir)
{
int a = 0;
int b = 0;
if (X_CLOCKWISE == dir)
{
a = cube_num[1][0];
b = cube_num[1][1];
cube_num[1][0] = cube_num[5][3];
cube_num[1][1] = cube_num[5][2];
cube_num[5][3] = cube_num[3][0];
cube_num[5][2] = cube_num[3][1];
cube_num[3][0] = cube_num[2][0];
cube_num[3][1] = cube_num[2][1];
cube_num[2][0] = a;
cube_num[2][1] = b;
//处理另外一面
a = cube_num[0][0];
cube_num[0][0] = cube_num[0][1];
cube_num[0][1] = cube_num[0][3];
cube_num[0][3] = cube_num[0][2];
cube_num[0][2] = a;
}
else if (X_COUNTERCLOCKWISE == dir)
{
a = cube_num[1][0];
b = cube_num[1][1];
cube_num[1][1] = cube_num[2][1];
cube_num[1][0] = cube_num[2][0];
cube_num[2][0] = cube_num[3][0];
cube_num[2][1] = cube_num[3][1];
cube_num[3][0] = cube_num[5][3];
cube_num[3][1] = cube_num[5][2];
cube_num[5][2] = b;
cube_num[5][3] = a;
//处理另外一面
a = cube_num[0][0];
cube_num[0][0] = cube_num[0][2];
cube_num[0][2] = cube_num[0][3];
cube_num[0][3] = cube_num[0][1];
cube_num[0][1] = a;
}
else if (Y_CLOCKWISE == dir)
{
a = cube_num[0][1];
b = cube_num[0][3];
cube_num[0][1] = cube_num[2][1];
cube_num[0][3] = cube_num[2][3];
cube_num[2][1] = cube_num[4][1];
cube_num[2][3] = cube_num[4][3];
cube_num[4][1] = cube_num[5][1];
cube_num[4][3] = cube_num[5][3];
cube_num[5][1] = a;
cube_num[5][3] = b;
//处理另外一面
a = cube_num[3][0];
cube_num[3][0] = cube_num[3][2];
cube_num[3][2] = cube_num[3][3];
cube_num[3][3] = cube_num[3][1];
cube_num[3][1] = a;
}
else if (Y_COUNTERCLOCKWISE == dir)
{
a = cube_num[0][1];
b = cube_num[0][3];
cube_num[0][3] = cube_num[5][3];
cube_num[0][1] = cube_num[5][1];
cube_num[5][1] = cube_num[4][1];
cube_num[5][3] = cube_num[4][3];
cube_num[4][1] = cube_num[2][1];
cube_num[4][3] = cube_num[2][3];
cube_num[2][1] = a;
cube_num[2][3] = b;
//处理另外一面
a = cube_num[3][0];
cube_num[3][0] = cube_num[3][1];
cube_num[3][1] = cube_num[3][3];
cube_num[3][3] = cube_num[3][2];
cube_num[3][2] = a;
}
else if ( Z_COUNTERCLOCKWISE == dir)
{
a = cube_num[0][2];
b = cube_num[0][3];
cube_num[0][3] = cube_num[3][2];
cube_num[0][2] = cube_num[3][0];
cube_num[3][2] = cube_num[4][0];
cube_num[3][0] = cube_num[4][1];
cube_num[4][1] = cube_num[1][3];
cube_num[4][0] = cube_num[1][1];
cube_num[1][1] = b;
cube_num[1][3] = a;
//处理另外一面
a = cube_num[2][0];
cube_num[2][0] = cube_num[2][1];
cube_num[2][1] = cube_num[2][3];
cube_num[2][3] = cube_num[2][2];
cube_num[2][2] = a;
}
else if (Z_CLOCKWISE == dir)
{
a = cube_num[0][2];
b = cube_num[0][3];
cube_num[0][3] = cube_num[1][1];
cube_num[0][2] = cube_num[1][3];
cube_num[1][1] = cube_num[4][0];
cube_num[1][3] = cube_num[4][1];
cube_num[4][1] = cube_num[3][0];
cube_num[4][0] = cube_num[3][2];
cube_num[3][0] = a;
cube_num[3][2] = b;
//处理另外一面
a = cube_num[2][0];
cube_num[2][0] = cube_num[2][2];
cube_num[2][2] = cube_num[2][3];
cube_num[2][3] = cube_num[2][1];
cube_num[2][1] = a;
}
}
void n_roate(int cube_num[6][4], int dir)
{
int op = 0;
if (X_CLOCKWISE == dir)
{
op = X_COUNTERCLOCKWISE;
}
else if (X_COUNTERCLOCKWISE == dir)
{
op = X_CLOCKWISE;
}
else if (Y_CLOCKWISE == dir)
{
op = Y_COUNTERCLOCKWISE;
}
else if (Y_COUNTERCLOCKWISE == dir)
{
op = Y_CLOCKWISE;
}
else if (Z_COUNTERCLOCKWISE == dir)
{
op = Z_CLOCKWISE;
}
else if (Z_CLOCKWISE == dir)
{
op = Z_COUNTERCLOCKWISE;
}
else
{
return;
}
cube_roate(cube_num, op);
}
void cubealg(int cube_num[6][4], int step_num, int index, int *max_degree)
{
int degree = 0;
degree = beautful_degree(cube_num);
if (degree > *max_degree)
{
*max_degree = degree;
}
if(index < step_num)
{
//有7中操作方法
for (int i = 0; i < 7; i++)
{
cube_roate(cube_num, i);
cubealg(cube_num, step_num, index + 1, max_degree);
//还原旋转操作
n_roate(cube_num, i);
}
}
}
void test_cube(int argc, char **args)
{
int argv[25] = { 0 };
int cube_num[6][4] = {0};
for (int i = 0; i < 24; i++)
{
scanf("%d", &argv[i]);
}
cube_num[0][0] = argv[0];
cube_num[0][1] = argv[1];
cube_num[0][2] = argv[2];
cube_num[0][3] = argv[3];
cube_num[1][0] = argv[4];
cube_num[1][1] = argv[5];
cube_num[1][2] = argv[10];
cube_num[1][3] = argv[11];
cube_num[2][0] = argv[6];
cube_num[2][1] = argv[7];
cube_num[2][2] = argv[12];
cube_num[2][3] = argv[13];
cube_num[3][0] = argv[8];
cube_num[3][1] = argv[9];
cube_num[3][2] = argv[14];
cube_num[3][3] = argv[15];
cube_num[4][0] = argv[16];
cube_num[4][1] = argv[17];
cube_num[4][2] = argv[18];
cube_num[4][3] = argv[19];
cube_num[5][0] = argv[20];
cube_num[5][1] = argv[21];
cube_num[5][2] = argv[22];
cube_num[5][3] = argv[23];
int max_degree = 0;
cubealg(cube_num, 5, 0, &max_degree);
printf("%d\n", max_degree);
}
int main(int argc, char** argv)
{
test_cube(argc, argv);
return 0;
}
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) def get_gracefulness(nums):
res = 0
res += nums[0]*nums[1]*nums[2]*nums[3]
res += nums[4]*nums[5]*nums[10]*nums[11]
res += nums[6]*nums[7]*nums[12]*nums[13]
res += nums[8]*nums[9]*nums[14]*nums[15]
res += nums[16]*nums[17]*nums[18]*nums[19]
res += nums[20]*nums[21]*nums[22]*nums[23]
return res
def turn(nums, kind=0):
new_nums = nums[:]
if kind == 0: #top_front
tmp = new_nums[6], new_nums[7]
new_nums[6], new_nums[7] = new_nums[8], new_nums[9]
new_nums[8], new_nums[9] = new_nums[23], new_nums[22]
new_nums[23], new_nums[22] = new_nums[4], new_nums[5]
new_nums[4], new_nums[5] = tmp
new_nums[0], new_nums[1], new_nums[3], new_nums[2] = new_nums[2], new_nums[0], new_nums[1], new_nums[3]
elif kind == 1: # top_back
tmp = new_nums[6], new_nums[7]
new_nums[6], new_nums[7] = new_nums[4], new_nums[5]
new_nums[4], new_nums[5] = new_nums[23], new_nums[22]
new_nums[23], new_nums[22] = new_nums[8], new_nums[9]
new_nums[8], new_nums[9] = tmp
new_nums[0], new_nums[1], new_nums[3], new_nums[2] = new_nums[1], new_nums[3], new_nums[2], new_nums[0]
elif kind == 2: # right, front
tmp = new_nums[7], new_nums[13]
new_nums[7], new_nums[13] = new_nums[17], new_nums[19]
new_nums[17], new_nums[19] = new_nums[21], new_nums[23]
new_nums[21], new_nums[23] = new_nums[1], new_nums[3]
new_nums[1], new_nums[3] = tmp
new_nums[8], new_nums[9], new_nums[15], new_nums[14] = new_nums[14], new_nums[8], new_nums[9], new_nums[15]
elif kind == 3:
tmp = new_nums[7], new_nums[13]
new_nums[7], new_nums[13] = new_nums[1], new_nums[3]
new_nums[1], new_nums[3] = new_nums[21], new_nums[23]
new_nums[21], new_nums[23] = new_nums[17], new_nums[19]
new_nums[17], new_nums[19] = tmp
new_nums[8], new_nums[9], new_nums[15], new_nums[14] = new_nums[9], new_nums[15], new_nums[14], new_nums[8]
elif kind == 4:# front, front
tmp = new_nums[2], new_nums[3]
new_nums[2], new_nums[3] = new_nums[11], new_nums[5]
new_nums[11], new_nums[5] = new_nums[17], new_nums[16]
new_nums[17], new_nums[16] = new_nums[8], new_nums[14]
new_nums[8], new_nums[14] = tmp
new_nums[6], new_nums[7], new_nums[13], new_nums[12] = new_nums[12], new_nums[6], new_nums[7], new_nums[13]
elif kind == 5:
tmp = new_nums[2], new_nums[3]
new_nums[2], new_nums[3] = new_nums[8], new_nums[14]
new_nums[8], new_nums[14] = new_nums[17], new_nums[16]
new_nums[17], new_nums[16] = new_nums[11], new_nums[5]
new_nums[11], new_nums[5] = tmp
new_nums[6], new_nums[7], new_nums[13], new_nums[12] = new_nums[7], new_nums[13], new_nums[12], new_nums[6]
return new_nums
class Solution:
def get_max(self, nums, n):
self.max = float('-inf')
def helper(nums, n):
res = get_gracefulness(nums)
self.max = max(self.max, res)
if n == 0:
return
res = float('-inf')
for kind in [0, 1, 2, 3, 4, 5]:
new_nums = turn(nums, kind)
helper(new_nums, n-1)
helper(nums, n)
return self.max
while True:
try:
nums = input()
nums = nums.split(' ')
nums = list(map(int, nums))
res = Solution().get_max(nums, 5)
print(res)
except:
break def top1(a):
a[0], a[1], a[4], a[22], a[23], a[9], a[10], a[20], a[21], a[15], a[18], a[19] =
a[10], a[4], a[18], a[20], a[22], a[0], a[19], a[21], a[23], a[1], a[15], a[9]
def top2(a):
top1(a), top1(a), top1(a)
def left1(a):
a[22], a[20], a[0], a[4], a[10], a[18], a[2], a[5], a[11], a[16], a[6], a[12] =
a[2], a[0], a[6], a[5], a[4], a[22], a[12], a[11], a[10], a[20], a[16], a[18]
def left2(a):
left1(a), left1(a), left1(a)
def back1(a):
a[23], a[22], a[9], a[1], a[0], a[4], a[8], a[3], a[2], a[5], a[7], a[6] =
a[8], a[9], a[7], a[3], a[1], a[23], a[6], a[2], a[0], a[22], a[5], a[4]
def back2(a):
back1(a), back1(a), back1(a)
def get_sum(a):
return a[0] * a[1] * a[2] *a[3] + a[6] * a[7] * a[12] * a[13] +
a[4] * a[5] * a[10] * a[11] + a[8] * a[9] * a[14] * a[15] +
a[16] * a[17] * a[18] * a[19] + a[20] * a[21] * a[22] * a[23]
def change(a, n):
if n == 5:
return get_sum(a)
top1(a)
c1 = change(a, n+1)
top2(a)
top2(a)
c2 = change(a, n+1)
top1(a)
back1(a)
c3 = change(a, n+1)
back2(a)
back2(a)
c4 = change(a, n+1)
back1(a)
left1(a)
c5 = change(a, n+1)
left2(a)
left2(a)
c6 = change(a, n+1)
left1(a)
return max(c1, c2, c3, c4, c5, c6, get_sum(a))
if name == 'main':
a = list(map(int, input().split()))
print(max(change(a, 0), get_sum(a)))
import java.util.Scanner;
public class Main {
static int max = 0;
static int[][][] ops = new int[][][] {{
{5, 11} , {5, 3}, {11, 2}, {2, 8}, {3, 14}, {8, 17}, {14, 16}, {16, 17}, {7}, {7, 13}, {13, 12}, {12, 6}, {6}
}, {
{5, 11} , {5, 16}, {11, 17}, {16, 14}, {17, 8}, {14, 3}, {8, 2}, {3, 2}, {7}, {7, 6}, {6, 12}, {12, 13}, {13}
} , {
{12, 13} , {12, 10}, {13, 11}, {11, 20}, {10, 21}, {20, 15}, {21, 14}, {14, 15}, {17}, {17, 16}, {16, 18}, {18, 19}, {19}
}, {
{10, 11} , {10, 12}, {11, 13}, {12, 14}, {13, 15}, {14, 21}, {15, 20}, {21, 20}, {17}, {17, 19}, {19, 18}, {18, 16}, {16}
}, {
{6, 12} , {6, 16}, {12, 18}, {16, 20}, {18, 22}, {20, 0}, {22, 2}, {0, 2}, {5}, {5, 11}, {11, 10}, {10, 4}, {4}
}, {
{6, 12} , {6, 0}, {12, 2}, {0, 20}, {2, 22}, {22, 18}, {20, 16}, {16, 18}, {5}, {5, 4}, {4, 10}, {10, 11}, {11}
}};
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int[] mf = new int[24];
for ( int i = 0; i < mf.length; i ++ ) {
mf[i] = sc.nextInt();
}
max = sum(mf);
for (int i = 0; i < 6; i ++) {
int[] tmp = new int[24];
System.arraycopy(mf, 0, tmp, 0, mf.length);
all(mf, i, 0);
mf = tmp;
}
System.out.println(max);
}
}
public static void all (int[] arr, int index, int time) {
rotate(arr, index);
int sum = sum(arr);
if (sum > max) {
max = sum;
}
if (time == 4) {
return;
}
for (int i = 0; i < 6; i ++) {
//这里要保存数组
int[] tmp = new int[24];
System.arraycopy(arr, 0, tmp, 0, arr.length);
all(arr, i, time + 1);
arr = tmp;
}
}
public static void rotate (int[] arr, int index) {
int ta = arr[ops[index][0][0]];
int tb = arr[ops[index][0][1]];
for (int i = 1; i <= 6; i ++) {
arr[ops[index][i][0]] = arr[ops[index][i][1]];
}
arr[ops[index][7][0]] = ta;
arr[ops[index][7][1]] = tb;
int tc = arr[ops[index][8][0]];
for (int i = 9; i <= 11; i ++) {
arr[ops[index][i][0]] = arr[ops[index][i][1]];
}
arr[ops[index][12][0]] = tc;
}
public static int sum (int[] arr) {
int a = arr[0] * arr[1] * arr[2] * arr[3];
int b = arr[4] * arr[5] * arr[10] * arr[11];
int c = arr[6] * arr[7] * arr[12] * arr[13];
int d = arr[8] * arr[9] * arr[14] * arr[15];
int e = arr[16] * arr[17] * arr[18] * arr[19];
int f = arr[20] * arr[21] * arr[22] * arr[23];
return a + b + c + d + e + f;
}
} (a+b) in [1,9]&nbs***bsp;((a+b)==5 and (a in [2,3]))因为 和为5 有多种可能性。
arr=[2,-3,-2,3,7,-6,-6,-7,9,-5,-9,-3,-2,1,4,-9,-1,-10,-5,-5,-10,-4,8,2] #旋转 def y0(s,n): if n==0: # 沿y轴向前 s[6],s[7],s[8],s[9],s[23],s[22],s[4],s[5],s[1],s[0],s[2],s[3]=s[4],s[5],s[6],s[7],s[8],s[9],s[23],s[22],s[3],s[1],s[0],s[2] elif n==1: #沿y轴向后 s[4],s[5],s[6],s[7],s[8],s[9],s[23],s[22],s[3],s[1],s[0],s[2]=s[6],s[7],s[8],s[9],s[23],s[22],s[4],s[5],s[1],s[0],s[2],s[3] elif n==2: #沿x轴向前 s[1],s[3],s[7],s[13],s[17],s[19],s[21],s[23],s[8],s[14],s[15],s[9]=s[7],s[13],s[17],s[19],s[21],s[23],s[1],s[3],s[14],s[15],s[9],s[8] elif n == 3: #沿x轴向后 s[7],s[13],s[17],s[19],s[21],s[23],s[1],s[3],s[14],s[15],s[9],s[8]=s[1],s[3],s[7],s[13],s[17],s[19],s[21],s[23],s[8],s[14],s[15],s[9] elif n == 4: #沿z周逆时针 s[6],s[7],s[13],s[12],s[8],s[14],s[17],s[16],s[11],s[5],s[2],s[3]=s[7],s[13],s[12],s[6],s[17],s[16],s[11],s[5],s[2],s[3],s[8],s[14] elif n == 5: #沿z周顺时针 s[7],s[13],s[12],s[6],s[17],s[16],s[11],s[5],s[2],s[3],s[8],s[14]=s[6],s[7],s[13],s[12],s[8],s[14],s[17],s[16],s[11],s[5],s[2],s[3] return s #求优美值 def addsum(s): return s[0]*s[1]*s[2]*s[3]+s[8]*s[9]*s[14]*s[15]+s[6]*s[7]*s[12]*s[13]+s[4]*s[5]*s[10]*s[11]+s[16]*s[17]*s[18]*s[19]+s[20]*s[21]*s[22]*s[23] #筛掉无用的旋转 def guolv(g): def jiance(a,b): #a+b =1 有两种可能 a=0 b=1 或 a=1 b=0,方向刚好相反,视为无效 #a+b =9 有两种可能 a=5 b=4 或 a=4 b=5,方向刚好相反,视为无效 #a+b =5 则有多种可能,可能是(2,3) (1,4) (0,5) ,只有(2,3)才有是 方向相反的过滤掉。 if (a+b) in [1,9]&nbs***bsp;((a+b)==5 and (a in [2,3])): return 100,100 else: return a,b for d in range(len(g)-1): g[d],g[d+1]=jiance(g[d],g[d+1]) return list(filter(lambda r: r!=100, g)) n=6 #遍历出各种可能性 result_list=[] for x in range(n): if guolv([x]) not in result_list: result_list.append(guolv([x])) #插入只旋转1次情况 for y in range(n): if guolv([x, y]) not in result_list: result_list.append(guolv([x, y])) #插入旋转2次情况 for z in range(n): if guolv([x, y, z]) not in result_list: result_list.append(guolv([x, y, z])) #插入旋转3次情况 for w in range(n): if guolv([x, y, z, w]) not in result_list: result_list.append(guolv([x, y, z, w])) #插入旋转4次情况 for u in range(n): #插入旋转5次情况 if x==y==z==w: #前4次旋转方向一致,可以视为没变化 if [u] not in result_list: result_list.append([u]) elif u==y==z==w: #后4次旋转方向一致,可以视为没变化 if [x] not in result_list: result_list.append([x]) else: if guolv([x,y,z,w,u]) not in result_list: result_list.append(guolv([x, y, z, w, u])) # print(result_list) result=addsum(arr) #遍历取最大值 for x in result_list: for y in x: arr=y0(arr, y) result=max(addsum(arr),result) print(result)
小白分享一下自己的思路,其实就是一个让你把魔方的旋转用代码写出来,我自己是用草稿纸做了一个魔方,观察了一下,步骤大致如下:
1 魔方旋转分类,共六种,每两种相互等价,代码写三种就够了;
2 写出递归函数,每一步六种情况,递归深度设置为5就可以了;
3 每一步求六个面积的和,与最大值比较保留最大值;递归结束输出最终的最大值。
#include <iostream>
#include <stdio.h>
using namespace std;
//全局变量区域
const long INF =2147483647;
const int m_size=24;
long int ms=-INF;
int aa[m_size] ;
//int aa[m_size] ={2, -3,-2 ,3, 7 ,-6, -6, -7 ,9 ,-5 ,-9, -3, -2 ,1 ,4 ,-9 ,-1 ,-10, -5 ,-5 ,-10 ,-4, 8, 2};
long int get_multi()
{
long int a1,a2,a3,a4,a5,a6;
a1=aa[0]aa[1]aa[2]aa[3];
a2=aa[4]aa[5]aa[10]aa[11];
a3=aa[6]aa[7]aa[12]aa[13];
a4=aa[8]aa[9]aa[14]aa[15];
a5=aa[16]aa[17]aa[18]aa[19];
a6=aa[20]aa[21]aa[22]aa[23];
return (a1+a2+a3+a4+a5+a6);
}
void upright() //上层向左转
{
int s14,s8;
s14=aa[14];
s8=aa[8];
aa[14]=aa[16];
aa[8]=aa[17];
int s3,s2;
s3=aa[3];
s2=aa[2];
aa[3]=s14;
aa[2]=s8;
int s5,s11;
s5=aa[5];
s11=aa[11];
aa[5]=s3;
aa[11]=s2;
aa[16]=s5;
aa[17]=s11;
int s6=aa[6];
aa[6]=aa[7];
aa[7]=aa[13];
aa[13]=aa[12];
aa[12]=s6;}
void upleft()
{
upright();
upright();
upright();
}
void rightup()
{
int s7,s13;
s7=aa[7];
s13=aa[13];
aa[7]=aa[17];
aa[13]=aa[19];
int s1,s3;
s1=aa[1];
s3=aa[3];
aa[1]=s7;
aa[3]=s13;
int s21,s23;
s23=aa[23];
s21=aa[21];
aa[21]=s1;
aa[23]=s3;
aa[17]=s21;
aa[19]=s23;
int s8=aa[8];
aa[8]=aa[14];
aa[14]=aa[15];
aa[15]=aa[9];
aa[9]=s8;
}
void rightdown()
{
rightup();
rightup();
rightup();
}
void headright()
{
int s14,s15;
s14=aa[14];
s15=aa[15];
aa[14]=aa[12];
aa[15]=aa[13];
int s21,s20;
s21=aa[21];
s20=aa[20];
aa[21]=s14;
aa[20]=s15;
int s10,s11;
s10=aa[10];
s11=aa[11];
aa[10]=s21;
aa[11]=s20;
aa[12]=s10;
aa[13]=s11;int s17=aa[17];
aa[17]=aa[16];
aa[16]=aa[18];
aa[18]=aa[19];
aa[19]=s17;
}
void headleft()
{
headright();
headright();
headright();
}
long big(long a,long b)
{
if(a>=b) return a;
else return b;
}
void (*pf[6])()= {&upright,&upleft,&rightup,&rightdown,&headright,&headleft};
void deep_trans(int deep)
{
if (deep>5) { return;}
int i;
long bv;
for(i=0;i<6;i++)
{
pfi;
bv=get_multi();
ms=big(ms,bv);
deep_trans(deep+1);
pfi^1;
}
}
int main() {
for (int i=0;i<m_size;i++)
scanf("%d",&aa[i]);
ms=get_multi();
deep_trans(1);
cout<<ms<<endl;
//long int sum2=get_multi();
//cout<<ms<<" "<<sum2<<endl;
return 0;
}
import java.util.*;
public class Q39 {
public int[] topCounterClockWise(int[]nums) {
int[]ans=new int[24];
for(int i=0;i<24;i++)ans[i]=nums[i];
//首先13,7,6,12位置轮换
//然后外面一圈14,8,3,2,5,11,16,17轮换,注意轮换是隔一个位置的
int temp=ans[13];
ans[13]=ans[7];
ans[7]=ans[6];
ans[6]=ans[12];
ans[12]=temp;
int temp1=ans[14];
int temp2=ans[8];
ans[14]=ans[3];
ans[8]=ans[2];
ans[3]=ans[5];
ans[2]=ans[11];
ans[5]=ans[16];
ans[11]=ans[17];
ans[16]=temp1;
ans[17]=temp2;
return ans;
}
public int[] leftCounterClockWise(int[]nums) {
int[]ans=new int[24];
for(int i=0;i<24;i++)ans[i]=nums[i];
//首先11,5,4,10位置轮换
//然后外面一圈18,16,12,6,2,0,22,20轮换
int temp=ans[11];
ans[11]=ans[5];
ans[5]=ans[4];
ans[4]=ans[10];
ans[10]=temp;
int temp1=ans[18];
int temp2=ans[16];
ans[18]=ans[12];
ans[16]=ans[6];
ans[12]=ans[2];
ans[6]=ans[0];
ans[2]=ans[22];
ans[0]=ans[20];
ans[22]=temp1;
ans[20]=temp2;
return ans;
}
public int[] frontCounterClockWise(int[]nums) {
int[]ans=new int[24];
for(int i=0;i<24;i++)ans[i]=nums[i];
//首先19,17,16,18位置轮换
//然后外面一圈20,21,15,14,13,12,11,10轮换
int temp=ans[19];
ans[19]=ans[17];
ans[17]=ans[16];
ans[16]=ans[18];
ans[18]=temp;
int temp1=ans[20];
int temp2=ans[21];
ans[20]=ans[15];
ans[21]=ans[14];
ans[15]=ans[13];
ans[14]=ans[12];
ans[13]=ans[11];
ans[12]=ans[10];
ans[11]=temp1;
ans[10]=temp2;
return ans;
}
public int[] topClockWise(int[]nums){
for(int i=0;i<3;i++)
nums=topCounterClockWise(nums);
return nums;}
public int[] leftClockWise(int[]nums){
for(int i=0;i<3;i++)
nums=leftCounterClockWise(nums);
return nums;}
public int[] frontClockWise(int[]nums){
for(int i=0;i<3;i++)
nums=frontCounterClockWise(nums);
return nums;}
public int getDegree(int[]nums) {
int sum=0;
sum+=nums[0]*nums[1]*nums[2]*nums[3];
sum+=nums[6]*nums[7]*nums[12]*nums[13];
sum+=nums[16]*nums[17]*nums[18]*nums[19];
sum+=nums[20]*nums[21]*nums[22]*nums[23];
sum+=nums[4]*nums[5]*nums[10]*nums[11];
sum+=nums[8]*nums[9]*nums[14]*nums[15];
return sum;
}
public int getMaxDegreeAfterKSteps(int[]nums,int k) {
List<Integer>list=new ArrayList<Integer>();
nextStep(nums,list,5);
return Collections.max(list);
}
public void nextStep(int[]nums,List<Integer>list,int stepsToGo) {
list.add(getDegree(nums));
if(stepsToGo==0) return;
int[]nums1=topClockWise(nums);
int[]nums2=leftClockWise(nums);
int[]nums3=frontClockWise(nums);
int[]nums4=topCounterClockWise(nums);
int[]nums5=leftCounterClockWise(nums);
int[]nums6=frontCounterClockWise(nums);
nextStep(nums1,list,stepsToGo-1);
nextStep(nums2,list,stepsToGo-1);
nextStep(nums3,list,stepsToGo-1);
nextStep(nums4,list,stepsToGo-1);
nextStep(nums5,list,stepsToGo-1);
nextStep(nums6,list,stepsToGo-1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//int[]nums= {2, -3 ,-2 ,3 ,7, -6 ,-6 ,-7 ,9, -5, -9 ,-3, -2, 1, 4, -9, -1,
// -10, -5, -5, -10, -4, 8 ,2};
//int[]nums1= {2, -3 ,-2 ,3 ,7, -6 ,-6 ,-7 ,9, -5, -9 ,-3, -2, 1, 4, -9, -1,
// -10, -5, -5, -10, -4, 8 ,2};
//for(int i=0;i<4;i++)nums1=new Q39().frontCounterClockWise(nums1);
//for(int i=0;i<24;i++)
//System.out.println(nums[i]+" "+nums1[i]);
Scanner sc=new Scanner(System.in);
int[]nums=new int[24];
for(int i=0;i<24;i++)nums[i]=sc.nextInt();
System.out.print(new Q39().getMaxDegreeAfterKSteps(nums, 5));
}
}