|
改良的暴力法:(和平解决办法留给OO去想)
把判断放到递归里面,一旦发现有同颜色的交叉点就及时中断。注意递归里面使用嵌套表的新玩法,这是我的最新研究成果。
EXEC :N:=4;
WITH b AS (
SELECT REPLACE(SYS_CONNECT_BY_PATH(n,','),',') str ----- 构造0,1的所有N位排列
FROM (SELECT 1 n FROM DUAL UNION ALL SELECT 0 FROM DUAL)
WHERE LEVEL=:N
CONNECT BY LEVEL<=:N
)
,t(lvl,all_str,str) AS (
SELECT 1,KU$_VCNT(str),str FROM b
UNION ALL
SELECT t.lvl+1
,t.all_str MULTISET UNION KU$_VCNT(b.str)
,b.str
FROM t,b
WHERE t.lvl<:N
AND t.str<b.str
AND NOT EXISTS (SELECT 1 FROM TABLE(t.all_str) WHERE NVL(REPLACE(LPAD(COLUMN_VALUE+b.str,:N,'0'),'1'),'0') NOT IN ('0','2','20','02'))
)
SELECT all_str FROM t WHERE lvl=:N;
ALL_STR
--------------------------------------------
KU$_VCNT('0011', '0101', '0110', '1000')
KU$_VCNT('0011', '0101', '0110', '1001')
KU$_VCNT('0011', '0101', '0110', '1010')
KU$_VCNT('0011', '0101', '0110', '1100')
KU$_VCNT('0011', '0101', '1000', '1110')
KU$_VCNT('0011', '0110', '1000', '1101')
KU$_VCNT('0101', '0110', '1000', '1011')
KU$_VCNT('0011', '0100', '1001', '1010')
KU$_VCNT('0011', '0100', '1001', '1110')
KU$_VCNT('0010', '0111', '1001', '1100')
KU$_VCNT('0100', '0111', '1001', '1010')
KU$_VCNT('0011', '0110', '1001', '1010')
KU$_VCNT('0011', '0110', '1001', '1100')
KU$_VCNT('0101', '0110', '1001', '1010')
KU$_VCNT('0101', '0110', '1001', '1100')
KU$_VCNT('0011', '0101', '1001', '1010')
KU$_VCNT('0011', '0101', '1001', '1100')
KU$_VCNT('0011', '0101', '1001', '1110')
KU$_VCNT('0010', '0101', '1001', '1100')
KU$_VCNT('0010', '0101', '1001', '1110')
KU$_VCNT('0011', '0100', '1010', '1101')
KU$_VCNT('0011', '1001', '1010', '1100')
KU$_VCNT('0101', '1001', '1010', '1100')
KU$_VCNT('0110', '1001', '1010', '1100')
KU$_VCNT('0111', '1001', '1010', '1100')
KU$_VCNT('0001', '0111', '1010', '1100')
KU$_VCNT('0011', '0110', '1010', '1100')
KU$_VCNT('0011', '0110', '1010', '1101')
KU$_VCNT('0101', '0110', '1010', '1100')
KU$_VCNT('0001', '0110', '1010', '1100')
KU$_VCNT('0001', '0110', '1010', '1101')
KU$_VCNT('0011', '0101', '1010', '1100')
KU$_VCNT('0010', '0101', '1011', '1100')
KU$_VCNT('0101', '0110', '1011', '1100')
KU$_VCNT('0001', '0110', '1011', '1100')
35 rows selected.
Elapsed: 00:00:00.02
EXEC :N:=5;
/
Elapsed: 00:00:00.06
速度快这么多?
|
|