ACme

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  17 随笔 :: 0 文章 :: 2 评论 :: 0 Trackbacks
网上 有好几种 解决方案,skywind.name上的这个最棒, 赞一下!
可惜 偶 苦思冥想 3 个小时,思路换了3、4种,也没找到完美解决方案。
以下 是 转自 skywind.name

12个小球称重问题的完美解法

先看答案,设小球编号分别从A到L,不管每次的结果如何(没有条件分支),如下比较三次:

A B C D === E F G H
A H I K === C D E J
C G I L === A D F K

我们将天平左侧重称为结果1;右侧重为结果-1;平衡为结果0。显然,如果上面三次比较的结果为1,1,-1,则A是坏的,并且比较重。如果结果是-1,0,0,则B比较重。我们还能得出一个额外的解,就是三次都平衡,则没有错误的小球。

所有球比较重的情况列表如下,将结果取反就是轻球的情况。可以看出,每个小球是否轻重都有且只有一种结果状态相对应。

 A  B  C  D  E  F  G  H  I  J  K  L
1 1 1 1 -1 -1 -1 -1 0 0 0 0
1 0 -1 -1 -1 0 0 1 1 -1 1 0
-1 0 1 -1 0 -1 1 0 1 0 -1 1

那么这个表是如何来的呢?能不能有其他本质上不同(不是这个次序的重排列)的类似方案呢?

先说怎么作这个表,将每一竖列看做一个向量,向量的每个分量可能取值为-1,0,1;按字典序取12个排在(000)后面的向量就是:

 A  B  C  D  E  F  G  H  I  J  K  L
0 0 0 0 1 1 1 1 1 1 1 1
0 1 1 1 -1 -1 -1 0 0 0 1 1
1 -1 0 1 -1 0 1 -1 0 1 -1 0

检查每一行,要求-1和1的数目相同,如果不能满足,则将某个1或-1取反。第三行自然满足,第二行可以把C的1改成-1,第一行可以更改F、H、J、L的值来达到目的。修改后的矩阵如下:

 A  B  C  D  E  F  G  H  I  J  K  L
0 0 0 0 1 -1 1 -1 1 -1 1 -1
0 1 -1 1 -1 -1 -1 0 0 0 1 1
1 -1 0 1 -1 0 1 -1 0 1 -1 0

这个结果与前面看起来不同,但实质一样。另外,通过这种方式也可以看出,3次天平称量13个小球问题是无解的。



posted on 2009-08-27 16:20 ACme 阅读(998) 评论(0)  编辑 收藏 引用 所属分类: 科研与算法

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理