设计一个魔方程序 可运行

算法课抽到的另一道题,大厂面试题

设计一个魔方(六面)的程序。

抽到这个题一头雾水,不知从何下手,借鉴了别人的经验,虽然没找到一个能运行的,但还是受到了启发,所以自己琢磨着写一写。
在这里插入图片描述

借鉴一张大佬的图(下图),我又加了几个标识,便于理解
在这里插入图片描述

代码干货

#!/usr/bin/env python
# -*- coding:utf-8 -*
# author:Zfy  date:2021/5/30 20:05


import numpy as np

# 构造魔方
s0 = np.zeros(9, dtype=np.int32).reshape(3,3)  # 第0面 正面
s1 = np.ones(9, dtype=np.int32).reshape(3,3)  # 第1面 右面
s2 = np.array([2 for _ in range(9)], dtype=np.int32).reshape(3,3)  # 第2面 后面
s3 = np.array([3 for _ in range(9)], dtype=np.int32).reshape(3,3)  # 第3面 左面
s4 = np.array([4 for _ in range(9)], dtype=np.int32).reshape(3,3)  # 第4面 上面
s5 = np.array([5 for _ in range(9)], dtype=np.int32).reshape(3,3)  # 第5面 下面


# 输出魔方
def print_cube():
    print("正面:{}".format(s0))
    print("右面:{}".format(s1))
    print("后面:{}".format(s2))
    print("左面:{}".format(s3))
    print("上面:{}".format(s4))
    print("下面:{}".format(s5))

# 面对正面(s0),左面(s3)逆时针旋转
def left_rotate():
    tmp = np.arange(3).reshape(3, 1)  # 临时数组
    for i in range(3):  # s0第一列存起来
        tmp[i][0] = s0[i][0]

    for i in range(3):
        s0[i][0] = s5[i][0]

    for i in range(3):
        s5[i][0] = s2[2-i][2]  # 注意2-i

    for i in range(3):
        s2[2-i][2] = s4[i][0]

    for i in range(3):
        s4[i][0] = tmp[i][0]

"""
实现全部旋转:
    - 魔方位置不变
    - 需要对六个面分别进行顺时针和逆时针旋转,总共需要十二个旋转函数
"""

if __name__ == '__main__':
    print_cube()  # 魔方初始值
    print("-----分割线-----")
    left_rotate()
    print_cube()

    # 再转一次
    # print("-----分割线-----")
    # left_rotate()
    # print_cube()

魔方初始值

在这里插入图片描述

转一次

在这里插入图片描述

转两次

在这里插入图片描述

12个旋转函数完整代码

#!/usr/bin/env python
# -*- coding:utf-8 -*
# author:Zfy  date:2021/5/30 20:05


import numpy as np

# 构造魔方
s0 = np.zeros(9, dtype=np.int32).reshape(3,3)  # 第0面 正面
s1 = np.ones(9, dtype=np.int32).reshape(3,3)  # 第1面 右面
s2 = np.array([2 for _ in range(9)], dtype=np.int32).reshape(3,3)  # 第2面 后面
s3 = np.array([3 for _ in range(9)], dtype=np.int32).reshape(3,3)  # 第3面 左面
s4 = np.array([4 for _ in range(9)], dtype=np.int32).reshape(3,3)  # 第4面 上面
s5 = np.array([5 for _ in range(9)], dtype=np.int32).reshape(3,3)  # 第5面 下面

# 输出魔方
def print_cube():
    print("正面:{}".format(s0))
    print("右面:{}".format(s1))
    print("后面:{}".format(s2))
    print("左面:{}".format(s3))
    print("上面:{}".format(s4))
    print("下面:{}".format(s5))

# 1、面对正面(s0),左面(s3)逆时针2旋转
def left_rotate2():
    tmp = np.arange(3).reshape(3, 1)  # 临时数组
    for i in range(3):  # s0第一列存起来
        tmp[i][0] = s0[i][0]

    for i in range(3):
        s0[i][0] = s5[i][0]

    for i in range(3):
        s5[i][0] = s2[2-i][2]  # 注意2-i

    for i in range(3):
        s2[2-i][2] = s4[i][0]

    for i in range(3):
        s4[i][0] = tmp[i][0]

"""
实现全部旋转:
    - 魔方位置不变
    - 需要对六个面分别进行顺时针和逆时针旋转,总共需要十二个旋转函数
"""

# 2、面对正面(s0),左面(s3)顺时针1旋转
def left_rotate1():
    tmp = np.arange(3).reshape(3, 1)  # 临时数组
    for i in range(3):  # s0第一列存起来
        tmp[i][0] = s0[i][2]

    for i in range(3):
        s0[i][0] = s4[i][0]

    for i in range(3):
        s4[i][0] = s2[2-i][2]  # 注意2-i

    for i in range(3):
        s2[2-i][2] = s5[i][0]

    for i in range(3):
        s5[i][0] = tmp[i][0]

# 3、面对正面(s0),右面(s1)顺时针1旋转
def right_rotate1():
    tmp = np.arange(3).reshape(3, 1)  # 临时数组
    for i in range(3):  # s0第一列存起来
        tmp[i][0] = s0[i][2]

    for i in range(3):
        s0[i][2] = s5[i][2]

    for i in range(3):
        s5[i][2] = s2[2-i][0]  # 注意2-i

    for i in range(3):
        s2[2-i][0] = s4[i][2]

    for i in range(3):
        s4[i][2] = tmp[i][0]

# 4、面对正面(s0),右面(s1)逆时针2旋转
def right_rotate2():
    tmp = np.arange(3).reshape(3, 1)  # 临时数组
    for i in range(3):  # s0第一列存起来
        tmp[i][0] = s0[i][2]

    for i in range(3):
        s0[i][2] = s4[i][2]

    for i in range(3):
        s4[i][2] = s2[2-i][0]  # 注意2-i

    for i in range(3):
        s2[2-i][0] = s5[i][2]

    for i in range(3):
        s5[i][2] = tmp[i][0]

# 5、面对正面(s0),正面(s0)顺时针1旋转
def front_rotate1():
    tmp = np.arange(3)  # 临时数组
    for i in range(3):  # s4第三行存起来
        tmp[i] = s4[2][i]

    for i in range(3):
        s4[2][i] = s3[2-i][2]

    for i in range(3):
        s3[2-i][2] = s5[0][2-i]

    for i in range(3):
        s5[0][2-i] = s1[i][0]

    for i in range(3):
        s1[i][0] = tmp[i]

# 6、面对正面(s0),正面(s0)逆时针2旋转
def front_rotate2():
    tmp = np.arange(3)  # 临时数组
    for i in range(3):  # s4第三行存起来
        tmp[i] = s4[2][i]

    for i in range(3):
        s4[2][i] = s1[i][0]

    for i in range(3):
        s1[i][0] = s5[0][2-i]

    for i in range(3):
        s5[0][2-i] = s3[2-i][2]

    for i in range(3):
        s3[2-i][2] = tmp[i]

# 7、面对正面(s0),后面(s2)顺时针1旋转
def rear_rotate1():
    tmp = np.arange(3)  # 临时数组
    for i in range(3):  # s4第三行存起来
        tmp[i] = s4[0][i]

    for i in range(3):
        s4[0][i] = s1[i][2]

    for i in range(3):
        s1[i][2] = s5[2][2-i]

    for i in range(3):
        s5[2][2-i] = s3[2-i][0]

    for i in range(3):
        s3[2-i][0] = tmp[i]

# 8、面对正面(s0),后面(s2)逆时针2旋转
def rear_rotate2():
    tmp = np.arange(3)  # 临时数组
    for i in range(3):  # s4第三行存起来
        tmp[i] = s4[0][i]

    for i in range(3):
        s4[0][i] = s3[2-i][0]

    for i in range(3):
        s3[2-i][0] = s5[2][2-i]

    for i in range(3):
        s5[2][2-i] = s1[i][2]

    for i in range(3):
        s1[i][2] = tmp[i]

# 9、面对正面(s0),上面(s4)顺时针1旋转
def up_rotate1():
    tmp = np.arange(3)  # 临时数组
    for i in range(3):  # s0第一行存起来
        tmp[i] = s0[0][i]

    for i in range(3):
        s0[0][i] = s1[0][i]

    for i in range(3):
        s1[0][i] = s2[0][i]

    for i in range(3):
        s2[0][i] = s3[0][i-2]

    for i in range(3):
        s3[0][i-2] = tmp[i]

# 10、面对正面(s0),上面(s4)逆时针2旋转
def up_rotate2():
    tmp = np.arange(3)  # 临时数组
    for i in range(3):  # s0第一行存起来
        tmp[i] = s0[0][i]

    for i in range(3):
        s0[0][i] = s3[0][i-2]

    for i in range(3):
        s3[0][i-2] = s2[0][i]

    for i in range(3):
        s2[0][i] = s1[0][i]

    for i in range(3):
        s1[0][i] = tmp[i]

# 11、面对正面(s0),下面(s5)顺时针1旋转
def down_rotate1():
    tmp = np.arange(3)  # 临时数组
    for i in range(3):  # s0第三行存起来
        tmp[i] = s0[2][i]

    for i in range(3):
        s0[2][i] = s3[2][i - 2]

    for i in range(3):
        s3[2][i-2] = s2[2][i]

    for i in range(3):
        s2[2][i] = s1[2][i]

    for i in range(3):
        s1[2][i] = tmp[i]

# 12、面对正面(s0),下面(s5)逆时针2旋转
def down_rotate2():
    tmp = np.arange(3)  # 临时数组
    for i in range(3):  # s0第三行存起来
        tmp[i] = s0[2][i]

    for i in range(3):
        s0[2][i] = s1[2][i]

    for i in range(3):
        s1[2][i] = s2[2][i]

    for i in range(3):
        s2[2][i] = s3[2][i-2]

    for i in range(3):
        s3[2][i-2] = tmp[i]



if __name__ == '__main__':
    print_cube()  # 魔方初始值
    print("-----分割线-----")
    # left_rotate1()
    # left_rotate2()
    # print_cube()
    # print("-----分割线-----")
    # right_rotate2()
    # right_rotate1()
    # front_rotate1()
    # front_rotate2()
    # rear_rotate1()
    # rear_rotate2()
    # up_rotate1()
    # up_rotate2()
    # down_rotate1()
    down_rotate2()
    print_cube()
    left_rotate2()
    print_cube()
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
(重要!!!其中使用了easyx图形库,easyx的外部文件需自己另外下载并配置好,本资源未包括该扩展库的文件,即把几个文件放进VC6.0的Lib文件夹里就好了) 作品名称:魔方还原 作品功能:进行三阶魔方还原。 界面介绍:打开程序首先进入一个有着发光魔方背景的欢迎界面,有“Rubik”和“Help”两个按钮。按“Help”按钮进入帮助界面,显示用键盘操作魔方的方法。按“Rubik”进入魔方还原的主界面,左边是一个可以看到三面的立体魔方,右边是与立体魔方对应的六面展开图。魔方初始状态是未被打乱的状态。另外搭配主界面的还有一个控制台窗口,用于显示操作步骤。 操作说明:从键盘直接输入字符控制,各字符含义如下。 0: 按数字零退出程序。 *: 按星号键执行逆序法还原魔方。 +: 按加号键执行魔方传统的“层先法”进行还原。 R: 顺时针90°转右面。 r: 逆时针90°转右面。 U: 顺时针90°转顶面。 u: 逆时针90°转顶面。 L: 顺时针90°转左面。 l: 逆时针90°转左面。 D: 顺时针90°转底面。 d: 逆时针90°转底面。 F: 顺时针90°转前面。 f: 逆时针90°转前面。 B: 顺时针90°转背面。 b: 逆时针90°转背面。 M: 向下转中层。 m: 向上转中层。 X: 顺着x轴转90°。 x: 逆着x轴转90°。 Y: 顺着y轴转90°。 y: 逆着y轴转90°。 Z: 顺着z轴转90°。 z: 逆着z轴转90°。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值