原帖由 〇〇 于 2010-1-3 19:48 发表 ![]()
如果要穷举所有可能的组合,从中找到一行符合要求的方法太笨了
房序号、颜色、国家、喝、吸、养每个都有5!个排列。一共就是120^6种
房子序号是不变的,1,2,3,4,5
因此是120^5。实际效果并不差。
条件8,9,14可以筛选掉一些。
你的方法和风铃有同样的问题,就是试图把列转成行。WHERE只能做列间比较,行间比较是做不到的,实际应用中,行间比较条件经常用分析函数转到同一行再作列间比较。
用我的方法写条件很清晰,再玩一点花样:
WITH class_nationality as (
SELECT 'Englishman' as s FROM dual
union all
SELECT 'Swede' FROM dual
union all
SELECT 'Dane' FROM dual
union all
SELECT 'Norwegian' FROM dual
union all
SELECT 'German' FROM dual
),
class_house as(
SELECT 'red' as s FROM dual
union all
SELECT 'white' FROM dual
union all
SELECT 'green' FROM dual
union all
SELECT 'yellow' FROM dual
union all
SELECT 'blue' FROM dual
),
class_beverages as(
SELECT 'tea' as s FROM dual
union all
SELECT 'coffee' FROM dual
union all
SELECT 'milk' FROM dual
union all
SELECT 'beer' FROM dual
union all
SELECT 'water' FROM dual
),
class_cigarettes as(
SELECT 'pall mall' as s FROM dual
union all
SELECT 'dunhill' FROM dual
union all
SELECT 'blends' FROM dual
union all
SELECT 'blue master' FROM dual
union all
SELECT 'prince' FROM dual
),
class_pets as(
SELECT 'dog' as s FROM dual
union all
SELECT 'bird' FROM dual
union all
SELECT 'cat' FROM dual
union all
SELECT 'horse' FROM dual
union all
SELECT 'fish' FROM dual
)
,nationality AS (
SELECT n1,n2,n3,n4,n5
,DECODE('Englishman',n1,1,n2,2,n3,3,n4,4,n5,5) AS n_Englishman
,DECODE('Swede' ,n1,1,n2,2,n3,3,n4,4,n5,5) AS n_Swede
,DECODE('Dane' ,n1,1,n2,2,n3,3,n4,4,n5,5) AS n_Dane
,DECODE('Norwegian' ,n1,1,n2,2,n3,3,n4,4,n5,5) AS n_Norwegian
,DECODE('German' ,n1,1,n2,2,n3,3,n4,4,n5,5) AS n_German
FROM (
SELECT TRIM(SUBSTR(p,2 ,19)) AS n1
,TRIM(SUBSTR(p,22,19)) AS n2
,TRIM(SUBSTR(p,42,19)) AS n3
,TRIM(SUBSTR(p,62,19)) AS n4
,TRIM(SUBSTR(p,82,19)) AS n5
FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
FROM class_nationality
WHERE LEVEL=5
CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
)
)
)
,house AS (
SELECT h1,h2,h3,h4,h5
,DECODE('red' ,h1,1,h2,2,h3,3,h4,4,h5,5) AS h_red
,DECODE('white' ,h1,1,h2,2,h3,3,h4,4,h5,5) AS h_white
,DECODE('green' ,h1,1,h2,2,h3,3,h4,4,h5,5) AS h_green
,DECODE('yellow',h1,1,h2,2,h3,3,h4,4,h5,5) AS h_yellow
,DECODE('blue' ,h1,1,h2,2,h3,3,h4,4,h5,5) AS h_blue
FROM (
SELECT TRIM(SUBSTR(p,2 ,19)) AS h1
,TRIM(SUBSTR(p,22,19)) AS h2
,TRIM(SUBSTR(p,42,19)) AS h3
,TRIM(SUBSTR(p,62,19)) AS h4
,TRIM(SUBSTR(p,82,19)) AS h5
FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
FROM class_house
WHERE LEVEL=5
CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
)
)
)
,beverages AS (
SELECT b1,b2,b3,b4,b5
,DECODE('tea' ,b1,1,b2,2,b3,3,b4,4,b5,5) AS b_tea
,DECODE('coffee',b1,1,b2,2,b3,3,b4,4,b5,5) AS b_coffee
,DECODE('milk' ,b1,1,b2,2,b3,3,b4,4,b5,5) AS b_milk
,DECODE('beer' ,b1,1,b2,2,b3,3,b4,4,b5,5) AS b_beer
,DECODE('water' ,b1,1,b2,2,b3,3,b4,4,b5,5) AS b_water
FROM (
SELECT TRIM(SUBSTR(p,2 ,19)) AS b1
,TRIM(SUBSTR(p,22,19)) AS b2
,TRIM(SUBSTR(p,42,19)) AS b3
,TRIM(SUBSTR(p,62,19)) AS b4
,TRIM(SUBSTR(p,82,19)) AS b5
FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
FROM class_beverages
WHERE LEVEL=5
CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
)
)
)
,cigarettes AS (
SELECT c1,c2,c3,c4,c5
,DECODE('pall mall' ,c1,1,c2,2,c3,3,c4,4,c5,5) AS c_pall_mall
,DECODE('dunhill' ,c1,1,c2,2,c3,3,c4,4,c5,5) AS c_dunhill
,DECODE('blends' ,c1,1,c2,2,c3,3,c4,4,c5,5) AS c_blends
,DECODE('blue master',c1,1,c2,2,c3,3,c4,4,c5,5) AS c_blue_master
,DECODE('prince' ,c1,1,c2,2,c3,3,c4,4,c5,5) AS c_prince
FROM (
SELECT TRIM(SUBSTR(p,2 ,19)) AS c1
,TRIM(SUBSTR(p,22,19)) AS c2
,TRIM(SUBSTR(p,42,19)) AS c3
,TRIM(SUBSTR(p,62,19)) AS c4
,TRIM(SUBSTR(p,82,19)) AS c5
FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
FROM class_cigarettes
WHERE LEVEL=5
CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
)
)
)
,pets AS (
SELECT p1,p2,p3,p4,p5
,DECODE('dog' ,p1,1,p2,2,p3,3,p4,4,p5,5) AS p_dog
,DECODE('bird' ,p1,1,p2,2,p3,3,p4,4,p5,5) AS p_bird
,DECODE('cat' ,p1,1,p2,2,p3,3,p4,4,p5,5) AS p_cat
,DECODE('horse',p1,1,p2,2,p3,3,p4,4,p5,5) AS p_horse
,DECODE('fish' ,p1,1,p2,2,p3,3,p4,4,p5,5) AS p_fish
FROM (
SELECT TRIM(SUBSTR(p,2 ,19)) AS p1
,TRIM(SUBSTR(p,22,19)) AS p2
,TRIM(SUBSTR(p,42,19)) AS p3
,TRIM(SUBSTR(p,62,19)) AS p4
,TRIM(SUBSTR(p,82,19)) AS p5
FROM (SELECT SYS_CONNECT_BY_PATH(RPAD(s,19),'\') AS p
FROM class_pets
WHERE LEVEL=5
CONNECT BY NOCYCLE LEVEL<=5 AND s<>PRIOR s
)
)
)
SELECT RPAD(n1,16)||RPAD(h1,16)||RPAD(b1,16)||RPAD(c1,16)||RPAD(p1,16)||CHR(10)||
RPAD(n2,16)||RPAD(h2,16)||RPAD(b2,16)||RPAD(c2,16)||RPAD(p2,16)||CHR(10)||
RPAD(n3,16)||RPAD(h3,16)||RPAD(b3,16)||RPAD(c3,16)||RPAD(p3,16)||CHR(10)||
RPAD(n4,16)||RPAD(h4,16)||RPAD(b4,16)||RPAD(c4,16)||RPAD(p4,16)||CHR(10)||
RPAD(n5,16)||RPAD(h5,16)||RPAD(b5,16)||RPAD(c5,16)||RPAD(p5,16) AS RESULT
FROM nationality
,house
,beverages
,cigarettes
,pets
WHERE n_Englishman = h_red
AND n_Swede = p_dog
AND n_Dane = b_tea
AND h_green = h_white -1
AND h_green = b_coffee
AND c_pall_mall = p_bird
AND h_yellow = c_dunhill
AND b_milk = 3
AND n_Norwegian = 1
AND ABS(c_blends - p_cat) =1
AND ABS(c_dunhill - p_horse) =1
AND c_blue_master = b_beer
AND n_German = c_prince
AND h_blue = 2
AND ABS(c_blends - b_water) = 1
/
这样修改后consistent gets降到了25, 还没用8,9,14的人肉优化呢。 |