5-22 魔方(Rubik’s Cube)问题
问题描述
3×3×3 3 × 3 × 3 魔方的构造如图所示。图中英文字母 U,L,F,R,B,D 分别表示魔方的 6 个面中的上面,左面,前面,右面,后面,底面。魔方的每个面都可以绕其中轴旋转。给定魔 方的初始状态,可以经过若干次旋转将魔方变换成每个面都只有一种颜色的状态。绕中轴将 一个面旋转 90 度算作一次旋转。试设计一个算法计算出从初始状态到目标状态(每个面都 只有一种颜色的状态)所需的最少旋转次数。
设计一个算法,对于给定的 3×3×3 3 × 3 × 3 魔方的初始状态,计算从初始状态到目标状态(每个面 都只有一种颜色的状态)所需的最少旋转次数。
数据输入:
3×3×3 3 × 3 × 3 魔方目标状态的每个面都有一种颜色,分别用大写 英文字母 W,O,G,R,Y,B 来表示。将 6 个面展开并编号如下图所示。文件将给定魔方 的初始状态的 6 个面,按照其编号依次排列,共有 18 行,每行有 3 个表示方块颜色的大写 英文字母。
Java
package Chapter5HuiSuFa;
import java.util.Arrays;
import java.util.Scanner;
public class MoFangRubiksCube {
private static class cubeT{
int[] cube = new int[20];
}
private static final int ID = 0;
private static final int FACE_U_CW = 1;
private static final int FACE_U_CCW = 2;
private static final int FACE_U_180 = 3;
private static final int FACE_L_CW = 4;
private static final int FACE_L_CCW = 5;
private static final int FACE_L_180 = 6;
private static final int FACE_F_CW = 7;
private static final int FACE_F_CCW = 8;
private static final int FACE_F_180 = 9;
private static final int CORNER_0_CW = 10;
private static final int CORNER_0_CCW = 11;
private static final int CORNER_2_CW = 12;
private static final int CORNER_2_CCW = 13;
private static final int CORNER_5_CW = 14;
private static final int CORNER_5_CCW = 15;
private static final int CORNER_7_CW = 16;
private static final int CORNER_7_CCW = 17;
private static final int EDGE_1 = 18;
private static final int EDGE_3 = 19;
private static final int EDGE_4 = 20;
private static final int EDGE_6 = 21;
private static final int EDGE_8 = 22;
private static final int EDGE_9 = 23;
private static int[] lc = {
1,2,4,3,1,1,1,5,0,3,2,0,5,4,5,2,4,0,3,2,4,3,0,5};
private static int[] rc = new int[24];
private static int[] fc = new int[24];
private static int[] bc = new int[24];
private static int[] uc = new int[24];
private static int[] dc = new int[24];
private static final int FF = 0;//前面顺时针
private static final int FR = 1;//前面逆时针
private static final int BF = 2;//后面顺时针
private static final int BR = 3;//后面逆时针
private static final int LF = 4;//左面顺时针
private static final int LR =