|
WITH d AS (
SELECT ROWNUM id
,CEIL(ROWNUM/8) r
,MOD(ROWNUM-1,8)+1 c
,ROWNUM val
FROM DUAL
CONNECT BY ROWNUM<=64
)
,dl as (select * from d where c<=:n)
,dr as (select * from d where c>:n)
,t(r,c,val,total,path) AS (
SELECT r,c,val,val,','||CAST(id AS VARCHAR2(1000)) FROM d WHERE r=1 AND c=1
UNION ALL
SELECT d.r,d.c,d.val,d.val+t.total,t.path||','||d.id
FROM t,dL d
WHERE INSTR(t.path||',',','||d.id||',')=0
AND (d.r,d.c) IN ((t.r-1,t.c),(t.r+1,t.c),(t.r,t.c+1),(t.r-1,t.c+1),(t.r+1,t.c+1))
AND d.val+t.total<=:M
AND (t.r<>8 OR t.c<>:n)
)
SELECT path FROM t WHERE r=8 AND c=:n AND total=:M and rownum=1;
SQL> exec :m:=394
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.01
SQL> @c:\downloads\2634
PATH
--------------------------------
,1,9,17,25,33,42,43,51,52,60,61
已用时间: 00: 00: 04.08
SQL> exec :n:=4
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.01
SQL> @c:\downloads\2634
PATH
--------------------------------
,1,9,17,25,33,41,49,50,58,51,60
已用时间: 00: 00: 00.98
SQL> exec :n:=6
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.00
SQL> @c:\downloads\2634
PATH
--------------------------------
,1,9,17,25,33,41,42,51,52,61,62
已用时间: 00: 00: 10.96
SQL> exec :n:=7
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.01
SQL> @c:\downloads\2634
PATH
--------------------------------
,1,9,17,25,26,35,43,52,61,62,63
已用时间: 00: 00: 20.62
SQL> exec :n:=8
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.00
SQL> @c:\downloads\2634
PATH
--------------------------------
,1,9,17,18,27,36,44,53,62,63,64
已用时间: 00: 00: 28.04
SQL> |
|