一开始用的方法是手工把所有相邻的线段写出来:
把12段从上到下,从左到右编号:
1 2
3 4 5
6 7
8 9 10
11 12
with s as (
SELECT level n,power(2,level) b from dual connect by level<=12
)
,c as (
select s1.b b1,s2.b b2,s1.b+s2.b b
from s s1,s s2
where (s1.n,s2.n) in ((1,2),(1,3),(1,4) -------手工枚举所有相邻的线段对
,(2,4),(2,5)
,(3,6),(3,8)
,(4,6),(4,7),(4,9)
,(5,7),(5,10)
,(6,7),(6,8),(6,9)
,(7,9),(7,10)
,(8,11)
,(9,11),(9,12)
,(10,12)
,(11,12)
)
)
,t (b,rn) as (
select b,1 from s
union all
select t.b+c.b-bitand(t.b,c.b) --- bitor
,row_number() over(partition by t.b+c.b-bitand(t.b,c.b) order by 1) rn
from t,c
where t.rn=1 ------- 去重复
and bitand(t.b,c.b) in (c.b1,c.b2)
)
select count(distinct b) from t;
改成 N 之后,N=4还是跑不出来,必须另想办法。 |