一道朋友圈的题

题目

一个题目,先上题目。
这里写图片描述
我的理解:用一笔连接图中的所有空心圆,不能出现斜线。只能在空心圆处90度拐弯,只能经过一个顶点一次。

问题转化

感觉到应该是一个图上的问题。所有的空心圆都是顶点,两个顶点之间有边当且仅当这两个顶点所对应的空心圆是相邻的,记这个图为 G(V,E) 。问题变为找到图上的一条路 p p经过图上所有的顶点,并且每个顶点只经过一次。

变成了一个搜索问题。即以任意途中顶点 v 开始,寻找满足约束的路。所以,索性这样改造一下图。在V中加入顶点 v 代表实心圆。原来的任意顶点u都与顶点 v 在新图G上有边,即 (u,v)E 。这样就形成了新图 G(u,v) 。这样直接从 v 顶点开始在树上搜索就可以了。

python代码如下。

import time
graph = [
       [0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [1,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,],
       [0,  1,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  1,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [1,  1,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  0,  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,  0,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  1,  0,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  1,  0,],
       [0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,  1,],
       [0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  0,],
       ]

def find_next(prefix_path, graph):
    if len(prefix_path) == 25 :
        print("path: %s"%prefix_path)
    cur_node = prefix_path[-1]
    next_queue = []
    for i in range(25):
        if graph[cur_node][i] == 1 and i not in prefix_path:
                next_queue.append(i)
    for next_node in next_queue:
        next_prefix_path = prefix_path + [next_node]
        find_next(next_prefix_path, graph)
counter = 0
start_time = time.time()
find_next([1], graph)

运行的结果是没有打印。所以这个问题应该没有可行解。

一点思考

可以发现。如果原问题的每个解,等价于在G(V,E)上的一个哈密顿环。设 G 上一个哈密顿环为 h ,那么只需要将顶点v去掉就可以得到一个原问题的解。反之亦然。所以问题就变成了寻找图 G 上的哈密顿环。当然可以先判断 G 上是否存在哈密顿环。(没找到这个存在性问题的较低复杂性的算法。)

原问题的解

这个问题原来是有人发在朋友圈的,所以我问他有答案吗。他说有的(吃了一鲸)。答案是这样的(说是脑筋急转弯):
这里写图片描述
仁者见仁,智者见智。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用[1]:大二第一次正式组队培训,目为2017年电赛的H(远程幅频特性测试装置)。由于能力不足,出老师将大二组的难度降了一个维度。实际上这是一道高频目(1M-40M),然而我们大二做的仅仅是处理1k-40kHz部分的信号。这道刚拿到手,虽然指导老师讲解了一遍,但是脑子里还是一头雾水,不知从何下手,经过我们一群小伙伴后来的讨论,才逐渐理解了目的意思。从一无所知到有所收获,与一群志同道合的朋友一起进步,一起成长,比起奖项,或许这才是电赛吸引人的地方。由于个人能力有限,还是个敲代码的,对于硬件原理也只是半知半解,故纰漏处望大家指正。[1] 引用[2]:至此关于此硬件部分的内容写的大致完毕了。作为一道高频,这不能通过面包板搭建以及软件仿真方法来调试电路,给硬件整体的电路调试节带来了很多麻烦,我们小组也是屡屡碰壁,不过最后也是能做出成品,还是有些感慨的,也欢迎大家来讨论。[2] 引用[3]:我们搭的这个玩意主要分为两个部分,电磁炮电路部分和控制电路部分,还有一块电源部分,当然其实测试现场是提供学生电源的,我们纯粹是吃饱了撑的。电磁炮部分:包括两个开关(一个充电,一个放电),一个高压电容,一个升压模块,一个线圈与炮管。控制部分:两个舵机 云台,一块F407(带触控屏),两个继电器,一块OpenMV,一个超声波模块。[3] 根据引用内容,2023电赛H一道关于远程幅频特性测试装置的目。这是一道高频,但我们大二组只处理了1k-40kHz部分的信号。在解过程中,我们遇到了一些困难,但通过小组的讨论,逐渐理解了目的意思。在硬件部分的设计中,我们分为电磁炮电路部分和控制电路部分,还有一个电源部分。电磁炮部分包括开关、高压电容、升压模块、线圈和炮管。控制部分包括舵机云台、F407开发板、继电器、OpenMV和超声波模块。由于这是一道高频,无法通过面包板搭建和软件仿真来调试电路,给整体的电路调试带来了一些麻烦。但最终我们还是成功完成了装置的制作。欢迎大家一起来讨论这道目。[1][2][3]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值