详解四立方体难题——包你迷

目录

零、前言

一、问题简述

二、问题求解

三、具体分析


  • 零、前言

        最近在学习图论的知识,遇到了四立方体难题(包你迷)这个问题。虽然有书上的参考答案,但是笨笨的我还是看了好久才看懂。网上资料很少,所以我在此记录下我的想法和心路历程,供后面的人参考。因为我才疏学浅,有什么不对的请大佬在评论区指出。

        PS:对问题有所了解的的大佬可以直接看第三部分。三、具体分析

  • 一、问题简述

        有四个大小相同的正立方体,每个立方体的每个面涂上红(R)、蓝(B)、绿(G)、黄(Y)四种颜色之一。现在你有这四个立方体,试把这四个立方体堆成一个柱体,使四种颜色在柱体的每个侧面上同时出现。

  • 二、问题求解

        例如,我们已经有了四个正立方体,把它展开,得到下面这四张展开图。


正立方体1
正立方体2

        

正立方体3
正立方体4

       


        1、以四种颜色R、B、G、Y为顶点构造一个无向图G,两个顶点之间有一条边当且仅当立方体的一对相对面的颜色为对应的两顶点所代表的颜色。于是,对每一个立方体有一个对应的图。例如,对所给的实例,四个立方体对应的图如下所示。


正立方体1
正立方体2

正立方体3
正立方体4


        2、把1中得到的四个图重叠成一个图。此时,每个立方体对应的图的各边上均标有此立方体的编号。在这个例子下,得到下图。


伪图

       


          3、判断伪图中是否有如下性质的子图H1.H2:

        (1)H1和H2无公共边,且都是2度正则图;

        (2)H1和H2中的每个恰好含有每个立方体的一条边。

        如果无此性质的子图H1和H2,则此对实例无解;否则有解,且H1为堆成体的前后面对应图,H2为左右面对应图。H1和H2将如下两张图所示。


H1
H2

 

 


其最终的目标摆法如下图。

目标堆

  • 三、具体分析

        我们不妨先认定上面的过程都是对的(废话本来就是书里写的),简单来看,我们按上面操作的过程就是在前后(或者左右)两面寻找一个回路。最初四个正立方体绘制的图像中每一条线都代表了正立方体的颜色对面关系。伪图就是四个正立方体的关系的集合。在伪图中寻找H1和H2就是在通过旋转等操作摆放四个正立方体。第一次听可能会觉得很奇怪,不必过于在意这一点,我们继续往后看。

        注意到H1和H2中同一个颜色的点实质上代表了前后(或者左右)的两个面,例如H1中的G既代表目标堆中④号正立方体的前面,又代表①号正立方体的后面。H1和H2无公共边是指一个正立方体的两个对面不能同时既出现再前后,又出现在左右;要求H1和H2为度为2的正则图,实质上要求了同一个颜色的面共连接了两个不同颜色的面;要求每个正立方体恰有一条边,是在要求我们找的回路包含了四个正立方体,而不是遗漏了其中几个。参考下面的效果图,聪明的你会发现这是必要的。具体的证明可以使用反证法,上面三条任意一条不成立,就会引出矛盾,这是显然的。

        从上面的分析中,我们可以发现,只要能找到H1和H2,就有那么一种摆放与之对应。那么是否只要有一种摆放满足要求,我们就能找到对应的H1和H2呢?答案是肯定的,我们就是那么通过构造来解决问题的。(废话)其大体的效果是这样的。蓝色的线从前面指向后面的同色的面,绿色的线从后面回到对应的前面。可以发现,下面的效果图中蓝色的线全体就是上面的H1本身。


效果图

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
指针是C编程语言中非常重要的概念之一,对于初学者来说可能会感到害怕和困惑。但只要理解了指针的原理和用法,就会发现它其实并不可怕。 首先,指针是一个存储变量地址的变量,它可以指向任何数据类型的变量,括整型、浮点型、字符型等等。我们可以通过指针访问变量的值,也可以通过指针修改变量的值,这是指针的一大优势。 其次,理解指针的应用场景能够帮助我们更好地使用它。比如,当我们需要在函数之间传递大量的数据时,通过传递指针可以提高程序的执行效率。另外,在动态内存分配和释放中,指针也是一个必不可少的工具。 理解指针的用法也是很重要的。首先,我们需要理解指针的声明和初始化。指针的声明使用“类型 * 变量名”的语法,例如 int *ptr; 表示声明了一个指向整型变量的指针。指针的初始化可以通过给指针赋值一个变量的地址或者通过取地址符&获取变量的地址。 然后,我们需要了解指针的运算。指针可以进行种基本的运算:取地址运算符&,取值运算符*,指针加法和指针减法。取地址运算符&用于获取变量的地址,取值运算符*用于获取指针所指向的变量的值。指针加法和指针减法用于指针地址的增加和减少,不同数据类型的指针相加或相减会有不同的结果。 最后,我们需要注意指针的安全性。在使用指针的过程中,需要特别小心避免空指针、野指针等问题的出现,因为这些问题容易引发程序的崩溃或者产生不可预知的结果。 总结来说,指针作为C语言中的重要概念,我们应该尽早学习和掌握。只要理解指针的原理和用法,我们就能够更加灵活地操作内存,提高程序的效率和功能。通过不断的实践和学习,我们可以逐渐摆脱对指针的恐惧,让指针成为我们编程的得力助手。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值