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