有101根电线 每根的一头在楼底 另一端在楼顶 有一个灯泡 一个电池 无数根很短的电线 怎么样在楼上一次在楼下去一次将电线的对应关系弄清楚。

来源:互联网 发布:java多线程技术 编辑:程序博客网 时间:2024/04/28 18:49

(阿里云)问题描述:有101根电线 每根的一头在楼底  另一端在楼顶  有一个灯泡 一个电池 无数根很短的电线  怎么样在楼上一次在楼下去一次将电线的对应关系弄清楚。

不知道标准的做法是怎样的,我只想到了以下一种办法:

在楼顶的阶段:
首先任意选出7根线(例如最左边的),可命名为A0~A6,那么还剩下94根线,编号为0~93,对于i线,可以写出i的二进制形式,例如11号的线可以写为0001011,那么11号线的楼顶这端就可以和A0,A1,A3用短电线相连,即二进制形式位为1则与对应的A中的线相连。

然后对A0~A6这7跟线按照如下关系连接起来:

比如横坐标为A2,纵坐标A1的格子为1表示把A2和A1连接起来,为什么要这样连接,很快就知道了。

现在我们可以带着电池和灯泡下楼了。

在楼下的阶段:
我们给每根线编号,比如B0~B100,那么现在开始做一件体力活,依次将两根电线的一端用灯泡和电池连接起来,如果灯泡亮了,那么就给两个电线(比如B3和B21)都加上一分,当你把所有电线的组合都做完之后,电线的分大概是这样子,有94根电线的分不超过7,而有7根电线的分则大于7,比如,
7,6,0,2,…,3,5,1,5 和52, 51, 50, 48, 49, 34, 31

显然出众的7根线就是A0~A6,现在问题就是如何区分A0~A6,很显然,我们可以通过得分来区分A0~A6。

定义A0的基本得分是0~93中的数第0位不为1的个数,A1、A2余次类推,然而,我们会发现,基本得分有相同的情况,事实上,A0~A6的基本得分依次为: 47, 46, 46, 46, 46, 32, 30,也就是说,仅依靠基本得分,分不清。

这时我们在楼上阶段的对这7根线之间作的连接的作用就出来了,在楼顶的这些工作使得它们有了额外的得分并且两两得分不一样,事实上,得分52的线,就是A0,51的,是A1…

于是A0~A6就区分开了。

最后一步就是对剩下的94根线中的每一根通过已经确定的A0~A6来确定他的编号的二进制形式,比如B23只有通过电池灯泡连接A0,A3,A6时灯泡会亮,那么楼底的B23就是楼顶的64+8+1=73号线。

不知道有没有更好的办法,总觉得工作量太大了。

0 0
原创粉丝点击