|
本帖最后由 newkid 于 2012-8-2 00:28 编辑
很不雅的暴力法,只能算到N=5, 看看能否找出规律再推广:
VAR N NUMBER;
EXEC :N:=4;
WITH g AS (
SELECT LEVEL-1 n
,TRUNC((LEVEL-1)/:N) r
,MOD(LEVEL-1,:N) c
,POWER(2,LEVEL-1) bit
FROM DUAL CONNECT BY LEVEL<=:N*:N
)
,t(lvl,bits,path,diag,diag2,r,c) AS (
SELECT 1,g.bit,CAST(r||'-'||c AS VARCHAR2(1000)),CASE WHEN r=c THEN 1 ELSE 0 END,CASE WHEN r+c=:N-1 THEN 1 ELSE 0 END,r,c
FROM g
WHERE r<=TRUNC((:N-1)/2) AND c<=TRUNC((:N-1)/2)
AND c>=r
UNION ALL
SELECT t.lvl+1
,t.bits+g.bit
,t.path||','||g.r||'-'||g.c
,t.diag + CASE WHEN g.r=g.c THEN lvl+1 ELSE 0 END
,t.diag2 + CASE WHEN g.r+g.c=:N-1 THEN lvl+1 ELSE 0 END
,g.r,g.c
FROM t,g
WHERE BITAND(t.bits,g.bit)=0
AND (t.r,t.c) IN ((g.r+1,g.c),(g.r-1,g.c),(g.r,g.c+1),(g.r,g.c-1))
)
SELECT GREATEST(diag,diag2),path FROM (
SELECT * FROM t WHERE lvl=:N*:N ORDER BY GREATEST(diag,diag2) DESC
)
WHERE ROWNUM=1
;
GREATEST(DIAG,DIAG2)
--------------------
PATH
---------------------------------------------------------------------
48
0-0,0-1,1-1,1-0,2-0,3-0,3-1,3-2,3-3,2-3,1-3,0-3,0-2,1-2,2-2,2-1
Elapsed: 00:00:00.13
SQL> EXEC :N:=5;
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
SQL> /
GREATEST(DIAG,DIAG2)
--------------------
PATH
-----------------------------------------------------------------------------------------------------------
97
0-0,0-1,0-2,1-2,1-1,1-0,2-0,3-0,4-0,4-1,4-2,3-2,3-3,4-3,4-4,3-4,2-4,1-4,0-4,0-3,1-3,2-3,2-2,2-1,3-1
Elapsed: 00:00:49.17
|
|