注释已经很详细了
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]; } }