算法设计与分析: 5-22 魔方(Rubik's Cube)问题

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 = 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值