设计一个魔方程序 可运行

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

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

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

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

代码干货

#!/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: 当然可以!下面是一个基本的思路: 1. 首先,你需要了解魔方的基本原理。这可以帮助你确定你的程序应该如何实现操作。 2. 其次,你需要了解 QT 的基本使用方法。这样你就可以使用 QT 创建界面、添加按钮、显示图像等。 3. 接下来,你可以开始考虑如何表示魔方。一种常用的方法是使用一个二维数组来表示每个立方体的颜色。 4. 然后,你可以编写代码来实现各种操作。例如,要转动魔方的前面一排,你可以编写一个函数来交换数组中相应位置的元素。 5. 最后,你可以使用 QT 创建界面,并在界面上添加按钮来触发这些操作。你也可以使用 QT 绘制图像来显示魔方的当前状态。 希望这些思路能帮助你开始编写你的程序! ### 回答2: 魔方还原程序一个利用QT编写的应用程序,用于解决魔方拧乱后的还原问题。以下是我对如何用QT编写魔方还原程序的简要介绍。 魔方还原程序的开发可以分为三个主要步骤: 第一步是界面设计和布局。使用QT的图形界面设计工具,我们可以创建一个用户友好的界面,包括展示魔方状态和还原算法的文本输入框等组件。可以通过放置按钮或者其他交互组件实现用户输入拧动指令或还原算法的功能。 第二步是状态记录和算法实现。我们需要设计一个数据结构来存储魔方的状态,并且编写相关的算法来实现魔方的还原。QT提供了多线程的支持,我们可以在后台线程中执行复杂的还原算法,以便在主界面中显示解决过程的信息。 第三步是界面交互和操作反馈。用户可以通过点击按钮或输入文本来拧动魔方或者输入还原算法。我们需要在界面上实时显示魔方状态的变化,并在完成还原或者出现错误时给予用户反馈。这可以通过更新魔方的界面表示和显示相应的提示信息来实现。 总结来说,用QT编写魔方还原程序需要进行界面设计和布局、状态记录和算法实现、界面交互和操作反馈等几个主要步骤。通过合理的设计和编程,我们可以实现一个功能完善、界面友好的魔方还原程序。 ### 回答3: 魔方还原程序一个使用QT编写的应用程序,主要用于解决魔方的还原问题。这个程序旨在提供一个直观且易于使用的界面,帮助用户快速还原魔方程序的主要功能包括: 1. 图形界面设计:使用QT的图形库,设计一个直观美观的界面,包括魔方的展示区域和操作按钮等。 2. 上传魔方状态:允许用户通过点击魔方上的采样按钮或手动输入魔方颜色的方式,上传当前魔方的状态。 3. 魔方还原算法程序将使用经典的魔方还原算法,如CFOP法或Roux法等,根据上传的魔方状态计算出还原步骤。 4. 还原步骤展示:在界面上显示一系列的还原步骤,该步骤可以是图形化的指示,也可以是文字说明,帮助用户按照正确的顺序旋转魔方还原。 5. 魔方还原记录:记录用户每次还原的时间,提供一个保存记录的功能,方便用户随时查看之前的还原记录。 6. 魔方生成:提供一个生成魔方的功能,用户可以选择生成一个已经打乱的魔方,然后使用程序还原,增加趣味性和挑战性。 通过QT编写一个魔方还原程序的好处是,QT提供了丰富的库函数和控件,可以方便地创建图形界面及实现用户交互。此外,QT还具备跨平台的特性,可以在不同操作系统上运行。 总之,QT编写的魔方还原程序将为用户提供一个方便、实用的工具,帮助他们学习和解决魔方的还原问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值