采用回溯法,算个上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;
}