|
用SQL证明六人最少需要8次:
最终每人得到所有消息的状态为111111即十进制的63。
因为没有BITOR, 采用A+B-BITAND(A,B)
WITH d AS (
SELECT LEVEL n FROM DUAL CONNECT BY LEVEL<=6
)
,p AS (
SELECT d1.n n1,d2.n n2,d1.n||d2.n pair FROM d d1, d d2 WHERE d1.n<d2.n
)
,t2 AS (
SELECT '12,23' AS path
,'*030707081632' as bits
FROM DUAL
UNION ALL
SELECT '12,34' AS path
,'*030312121632' as bits
FROM DUAL
)
,t(cnt,path,bits) AS (
SELECT 3
,t2.path||','||p.pair
, SUBSTR(bits,1,n1*2-1)
||LPAD(SUBSTR(bits,n1*2,2)+SUBSTR(bits,n2*2,2)-BITAND(SUBSTR(bits,n1*2,2),SUBSTR(bits,n2*2,2)),2,'0')
||SUBSTR(bits,n1*2+2,(n2-n1-1)*2)
||LPAD(SUBSTR(bits,n1*2,2)+SUBSTR(bits,n2*2,2)-BITAND(SUBSTR(bits,n1*2,2),SUBSTR(bits,n2*2,2)),2,'0')
||SUBSTR(bits,n2*2+2)
FROM t2,p
WHERE t2.path='12,23' AND p.pair IN ('14','24','45')
OR t2.path='12,34' AND p.pair IN ('13','15','56')
UNION ALL
SELECT cnt+1
,t.path||','||p.pair
, SUBSTR(bits,1,n1*2-1)
||LPAD(SUBSTR(bits,n1*2,2)+SUBSTR(bits,n2*2,2)-BITAND(SUBSTR(bits,n1*2,2),SUBSTR(bits,n2*2,2)),2,'0')
||SUBSTR(bits,n1*2+2,(n2-n1-1)*2)
||LPAD(SUBSTR(bits,n1*2,2)+SUBSTR(bits,n2*2,2)-BITAND(SUBSTR(bits,n1*2,2),SUBSTR(bits,n2*2,2)),2,'0')
||SUBSTR(bits,n2*2+2)
FROM t,p
WHERE SUBSTR(bits,n1*2,2)<>SUBSTR(bits,n2*2,2)
AND cnt<8
AND bits<>'*636363636363'
)
SELECT * FROM (
SELECT * FROM t WHERE bits='*636363636363' ORDER BY cnt
)
WHERE ROWNUM=1;
CNT
----------
PATH
----------------------------------
BITS
----------------------------------
8
12,34,15,46,56,14,13,12
*636363636363
跑了两分多钟,前三层还是用手工排除了拓扑等价的那些组合。 |
|