注释已经很详细了
import java.util.*;
public class Main {
/**
* 记录三种旋转需要变动的下标,共三组下标
* 每组下标里,每4个下标形成一个轮回
*/
private static int[][] map = new int[][]{
{0,1,3,2,7,5,22,9,6,4,23,8},
{6,7,13,12,2,8,17,11,3,14,16,5},
{4,5,11,10,0,6,16,20,2,12,18,22}
};
/**
* main
* @param args 命令行参数
*/
public static void main(String[] args) {
// 读取输入
Scanner sc = new Scanner(System.in);
int[] n = new int[24];
for (int i = 0; i < 24; i++) {
n[i] = sc.nextInt();
}
// 输出结果
System.out.println(resolve(n, -1, 5));
}
/**
* 分析当前状态
* @param n 当前状态
* @param type 达到当前状态时的最后一个操作类型
* @param remain 剩余操作数
* @return 可以达到的最大优美度
*/
private static int resolve(int[] n, int type, int remain) {
// 非法状态
if (remain < 0) return Integer.MIN_VALUE;
// 当前状态优美度
int max = compute(n);
// 尝试转动,不可与type类型相同
if (type != 0) max = Math.max(max, turn(n, 0, remain));
if (type != 1) max = Math.max(max, turn(n, 1, remain));
if (type != 2) max = Math.max(max, turn(n, 2, remain));
return max;
}
/**
* 按照类型转动魔方多次并分析
* @param n 当前状态
* @param type 转动类型
* @param remain 剩余操作数
* @return 转动可以达到的最大优美度
*/
private static int turn(int[] n, int type, int remain) {
// 转动一次
turn(n, type);
int max = resolve(n, type, remain-1);
// 转动两次
turn(n, type);
max = Math.max(max, resolve(n, type, remain-2));
// 转动三次,相当于逆向转动一次
turn(n, type);
max = Math.max(max, resolve(n, type, remain-1));
// 转动四次,还原初始状态
turn(n, type);
return max;
}
/**
* 转动操作
* @param n 当前状态
* @param type 转动类型
*/
private static void turn(int[] n, int type) {
// 每四个下标一轮回
for (int i = 0, tmp = 0; i < 12; i++) {
if (i % 4 == 0) tmp = n[map[type][i]];
if (i % 4 == 3) n[map[type][i]] = tmp;
else n[map[type][i]] = n[map[type][i+1]];
}
}
/**
* 计算当前状态的优美度
* @param n 当前状态
* @return 优美度
*/
private static int compute(int[] n) {
return n[0]*n[1]*n[2]*n[3] +
n[6]*n[7]*n[12]*n[13] +
n[4]*n[5]*n[10]*n[11] +
n[8]*n[9]*n[14]*n[15] +
n[16]*n[17]*n[18]*n[19] +
n[20]*n[21]*n[22]*n[23];
}
}


京公网安备 11010502036488号