首页 > 试题广场 >

附加题

[编程题]附加题
  • 热度指数:1851 时间限制: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
发表于 2017-12-31 12:58:50 回复(4)


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;
}


编辑于 2021-03-04 20:47:47 回复(0)
#include <cstdio>
#include <algorithm>

using namespace std;
int M_orig[24], M[24];

/**
* 旋转一次魔方
* @param x: 0 -- 11
*         even: 顺时针, odd: 逆时针
*/
void SingleRotate(int x)
{
    int t;
    switch (x) {
        case 0:    // 0,1 上方
            t = M[0];
            M[0] = M[2];
            M[2] = M[3];
            M[3] = M[1];
            M[1] = t;
            t = M[4];
            M[4] = M[6];
            M[6] = M[8];
            M[8] = M[23];
            M[23] = t;
            t = M[5];
            M[5] = M[7];
            M[7] = M[9];
            M[9] = M[22];
            M[22] = t;
            break;
        case 1:
            t = M[0];
            M[0] = M[1];
            M[1] = M[3];
            M[3] = M[2];
            M[2] = t;
            t = M[4];
            M[4] = M[23];
            M[23] = M[8];
            M[8] = M[6];
            M[6] = t;
            t = M[5];
            M[5] = M[22];
            M[22] = M[9];
            M[9] = M[7];
            M[7] = t;
            break;
        case 2:    // 2,3 左
            t = M[4];
            M[4] = M[10];
            M[10] = M[11];
            M[11] = M[5];
            M[5] = t;
            t = M[0];
            M[0] = M[20];
            M[20] = M[16];
            M[16] = M[6];
            M[6] = t;
            t = M[2];
            M[2] = M[22];
            M[22] = M[18];
            M[18] = M[12];
            M[12] = t;
            break;
        case 3:
            t = M[4];
            M[4] = M[5];
            M[5] = M[11];
            M[11] = M[10];
            M[10] = t;
            t = M[0];
            M[0] = M[6];
            M[6] = M[16];
            M[16] = M[20];
            M[20] = t;
            t = M[2];
            M[2] = M[12];
            M[12] = M[18];
            M[18] = M[22];
            M[22] = t;
            break;
        case 4:    // 4,5 前
            t = M[6];
            M[6] = M[12];
            M[12] = M[13];
            M[13] = M[7];
            M[7] = t;
            t = M[2];
            M[2] = M[11];
            M[11] = M[17];
            M[17] = M[8];
            M[8] = t;
            t = M[3];
            M[3] = M[5];
            M[5] = M[16];
            M[16] = M[14];
            M[14] = t;
            break;
        case 5:
            t = M[6];
            M[6] = M[7];
            M[7] = M[13];
            M[13] = M[12];
            M[12] = t;
            t = M[2];
            M[2] = M[8];
            M[8] = M[17];
            M[17] = M[11];
            M[11] = t;
            t = M[3];
            M[3] = M[14];
            M[14] = M[16];
            M[16] = M[5];
            M[5] = t;
            break;
        case 6:    // 6,7 右
            t = M[8];
            M[8] = M[14];
            M[14] = M[15];
            M[15] = M[9];
            M[9] = t;
            t = M[1];
            M[1] = M[7];
            M[7] = M[17];
            M[17] = M[21];
            M[21] = t;
            t = M[3];
            M[3] = M[13];
            M[13] = M[19];
            M[19] = M[23];
            M[23] = t;
            break;
        case 7:
            t = M[8];
            M[8] = M[9];
            M[9] = M[15];
            M[15] = M[14];
            M[14] = t;
            t = M[1];
            M[1] = M[21];
            M[21] = M[17];
            M[17] = M[7];
            M[7] = t;
            t = M[3];
            M[3] = M[23];
            M[23] = M[19];
            M[19] = M[13];
            M[13] = t;
            break;
        case 8:    // 8,9 下
            t = M[16];
            M[16] = M[18];
            M[18] = M[19];
            M[19] = M[17];
            M[17] = t;
            t = M[10];
            M[10] = M[21];
            M[21] = M[14];
            M[14] = M[12];
            M[12] = t;
            t = M[11];
            M[11] = M[20];
            M[20] = M[15];
            M[15] = M[13];
            M[13] = t;
            break;
        case 9:
            t = M[16];
            M[16] = M[17];
            M[17] = M[19];
            M[19] = M[18];
            M[18] = t;
            t = M[10];
            M[10] = M[12];
            M[12] = M[14];
            M[14] = M[21];
            M[21] = t;
            t = M[11];
            M[11] = M[13];
            M[13] = M[15];
            M[15] = M[20];
            M[20] = t;
            break;
        case 10:    // 10,11 后
            t = M[22];
            M[22] = M[23];
            M[23] = M[21];
            M[21] = M[20];
            M[20] = t;
            t = M[0];
            M[0] = M[9];
            M[9] = M[19];
            M[19] = M[10];
            M[10] = t;
            t = M[1];
            M[1] = M[15];
            M[15] = M[18];
            M[18] = M[4];
            M[4] = t;
            break;
        case 11:
            t = M[22];
            M[22] = M[20];
            M[20] = M[21];
            M[21] = M[23];
            M[23] = t;
            t = M[0];
            M[0] = M[10];
            M[10] = M[19];
            M[19] = M[9];
            M[9] = t;
            t = M[1];
            M[1] = M[4];
            M[4] = M[18];
            M[18] = M[15];
            M[15] = t;
            break;
    }
}

constexpr int NUM_WIDTH = 4;

void printCube()
{
    printf("%*c%*c%*d%*d\n", NUM_WIDTH, ' ', NUM_WIDTH, ' ', NUM_WIDTH, M[0], NUM_WIDTH, M[1]);
    printf("%*c%*c%*d%*d\n", NUM_WIDTH, ' ', NUM_WIDTH, ' ', NUM_WIDTH, M[2], NUM_WIDTH, M[3]);
    printf("%*d%*d%*d%*d%*d%*d\n", NUM_WIDTH, M[4], NUM_WIDTH, M[5], NUM_WIDTH, M[6], NUM_WIDTH, M[7], NUM_WIDTH, M[8],
           NUM_WIDTH, M[9]);
    printf("%*d%*d%*d%*d%*d%*d\n", NUM_WIDTH, M[10], NUM_WIDTH, M[11], NUM_WIDTH, M[12], NUM_WIDTH, M[13], NUM_WIDTH,
           M[14], NUM_WIDTH, M[15]);
    printf("%*c%*c%*d%*d\n", NUM_WIDTH, ' ', NUM_WIDTH, ' ', NUM_WIDTH, M[16], NUM_WIDTH, M[17]);
    printf("%*c%*c%*d%*d\n", NUM_WIDTH, ' ', NUM_WIDTH, ' ', NUM_WIDTH, M[18], NUM_WIDTH, M[19]);
    printf("%*c%*c%*d%*d\n", NUM_WIDTH, ' ', NUM_WIDTH, ' ', NUM_WIDTH, M[20], NUM_WIDTH, M[21]);
    printf("%*c%*c%*d%*d\n\n", NUM_WIDTH, ' ', NUM_WIDTH, ' ', NUM_WIDTH, M[22], NUM_WIDTH, M[23]);
}

/**
* 旋转魔方
* @param K
*/
void Rotate(int step, int K)
{
    copy_n(M_orig, 24, M);
//    printCube();
    for (int i = 0; i < step; ++i, K /= 12) {
        SingleRotate(K % 12);
//        printf("Rotate %d:\n", K % 12);
//        printCube();
    }
}

/**
* 求出当前魔方的优美度
* @return
*/
inline int calc()
{
    return M[0] * M[1] * M[2] * M[3] + M[4] * M[5] * M[10] * M[11] + M[6] * M[7] * M[12] * M[13] +
           M[8] * M[9] * M[14] * M[15] + M[16] * M[17] * M[18] * M[19] + M[20] * M[21] * M[22] * M[23];
}

int solve()
{
    copy_n(M_orig, 24, M);
    int ans = calc();
    for (int step = 1, KASE = 12; step <= 5; ++step, KASE *= 12)
        for (int k = 0; k < KASE; ++k) {
            Rotate(step, k);
//            int x = calc();
//            if (x > ans) {
//                printf("step:%d, k:%d, x:%d\nM: ", step, k, x);
//                for (int i = 0; i < 24; ++i)
//                    printf(" %d", M[i]);
//                putchar('\n');
//                ans = x;
//            }
            ans = max(ans, calc());
        }
    return ans;
}

int main()
{
    for (int i = 0; i < 24; ++i)
        scanf("%d", &M_orig[i]);
    printf("%d\n", solve());
//    Rotate(5, 225572);
//    printf("%d\n", calc());
}
/**
-87 30 -71 -36 18 9 -58 93 -46 79 -14 -52 -10 24 56 66 42 38 -9 -73 -34 45 -45 98
 52665309

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

2 1 -2 1 1 1 1 2 1 1 1 1 1 1 1 -2 1 1 1 1 1 1 1 -1
 21
 */

/**
step:5, k:225572, x:10240
M:  -9 8 9 -9 -5 3 -7 -10 -5 7 -1 -2 -6 -10 1 -2 -6 4 -5 2 -3 2 -3 -4
 */
编辑于 2019-03-24 12:12:19 回复(3)
#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次也可以,每次都要计算取值),每次值传递避免污染
2.每次旋转不仅侧面8个块变化,正面4个块也要模拟旋转
发表于 2022-02-23 12:23:49 回复(0)
通过率80% 哪里出问题了😂
#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;
}


发表于 2020-08-16 20:05:28 回复(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)


编辑于 2019-04-09 14:35:13 回复(6)
时间原因,说下部分解析吧!
二阶魔方,有三个轴,定义为xyz
x轴转动,默认一个方向,反向的话就是默认转三次嘛!
函数有两个参数move(revolve_dir,times),分别是转的轴,和转的次数!
self.list为存储值的列表,这里python可以使用dic来存储键值对,但是tuple就不行啦!
每次都是操作这个list,最终返回list
每个面的优美度就是面的乘积,时间问题,我只考虑了正数的可能,每个面的正数和越大(每个数都不同的情况下),带0的面的和越小,总优美度就越大,或者直接平方,计算机处理平方速度快,平方就是地址后移,没移一次计算一次总优美度,最终得出结论


python2
#_*_coding=utf-8_*_


'''

横向旋转为X轴,竖向为Y,否则为Z

author : Cternater
Email : 1804842134@qq.com
'''

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)



发表于 2018-09-04 18:13:31 回复(0)
思路很简单,就是先计算当前的优美度。然后计算旋转一次后所有可能的最大优美度。取最大值。
在旋转一次后的最大优美度可以递归的计算出来。当旋转次数为0时就是递归出口。
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;
    }
}

发表于 2020-08-18 22:43:12 回复(0)
玩过3阶魔方,这道题是典型的回溯算法,模板如下:
func backtrack(选择列表,路径):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(选择列表,路径)
撤销选择

对二阶魔方来说,有6个面,每个面可以顺时针逆时针旋转,有6*2=12种选择
但是事实上右侧的顺时针旋转和左侧的顺时针旋转是等价的,因此只有6种选择,且每2种互为逆操作,即选择,撤销选择
这道题,简化为,找3个轴方向,观察坐标的转换关系(需要一些空间想象力),这里是以6,7,12,13作为顶面观察,计算顶面,前面,右面的旋转变化,代码如下:
注意点:golang可以原地swap,即 a, b = b, a
因此逆向操作实际上转换一下 = 的左右即可
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))
     
}



发表于 2020-07-18 17:37:30 回复(0)
#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");
}

发表于 2022-05-05 21:16:24 回复(0)

采用回溯法,算个上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;
}
发表于 2022-03-03 21:24:35 回复(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)
发表于 2022-02-24 20:23:01 回复(0)
可以将所有的方式看成树,深度为5,则将其进行遍历即可
发表于 2021-06-14 22:54:49 回复(0)
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

发表于 2020-11-25 22:12:19 回复(0)

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)))

发表于 2020-08-12 16:35:01 回复(0)
太菜了,只会傻瓜暴力法...
需要注意的是,如果是用深度递归,并且旋转操作会影响数组元素,那么在递归调用前应该保留数组
返回的时候再次递归调用的时候要用同一个数组,才能表示从同一个状态出发
因为深度调用以后数组是脏数据,数组在堆里,做为形参时总是被修改堆里的内容。
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;
    }

}


发表于 2020-08-07 10:49:11 回复(0)
解题思路:首先说,我有点无耻了。程序验证没通过。但是我也监测实在是太困难了。我只能说我尽力了。我说说我的思路,哪位大神 看看能帮我找出错在哪里了 拜托 拜托
1、首先写了一个函数y0,专门负责旋转魔方的。一共有6种旋转模式。 分别列出了旋转后的置换结果。
2、又是挺无耻的,没写成 放回的全排列,直接把所有的排列可能用循环写了。好在仅转动 5次。每次转动都有6种旋转模式。就是 6*6*6*6*6种全排列。
3、为了提高点效率,我把上述可能的结果做了筛查。
例如【0,0,0,0,1】的,这就是说,同一旋转模式连续4次。连续4次,相当于没动。则把4次连续的删掉。保留【1】。
还有一种可能,就是连续两次旋转的方向刚好相反,可以视为无效。即,如果是(0,1)(1,0)(4,5)(5,4)(2,3)(3,2)都是这样的情况。判断是可以通过
(a+b) in [1,9]&nbs***bsp;((a+b)==5 and (a in [2,3]))
因为 和为5 有多种可能性。

例如 【0,1,2,3,4】
编了一个函数guolv(),执行后结果为【2,3,4】。

其实思路不复杂,就是暴力。但是验证太困难了。我也不知道错在哪里了。

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)


编辑于 2020-02-09 00:11:00 回复(0)

小白分享一下自己的思路,其实就是一个让你把魔方的旋转用代码写出来,我自己是用草稿纸做了一个魔方,观察了一下,步骤大致如下:
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;
}

发表于 2019-04-19 20:48:27 回复(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));
    }
}

发表于 2019-04-08 23:59:35 回复(1)

3道编程题通过代码可以在我的牛客网刷题查看(只有代码,没有详细解析)

发表于 2018-03-02 16:39:10 回复(0)