|
我直接用十六进制,但排列上没想到用你那种Z字形的方法。
WITH t (cnt,c1,c2,c3,l,r) AS (
SELECT 1 cnt, LEVEL c1,TO_NUMBER(NULL) c2,TO_NUMBER(NULL) c3,TO_NUMBER(NULL) l,CAST(TO_CHAR(LEVEL,'X') AS VARCHAR2(20)) FROM DUAL CONNECT BY LEVEL<=10
UNION ALL
SELECT t.cnt+1
,DECODE(MOD(t.cnt,3),1,n.n,t.c1)
,DECODE(MOD(t.cnt,3),2,n.n,t.c2)
,DECODE(MOD(t.cnt,3),0,n.n,t.c3)
,DECODE(MOD(t.cnt,3),0,TO_NUMBER(NULL),n.n)
,t.r||TO_CHAR(n.n,'X')
FROM t,(SELECT LEVEL n FROM DUAL CONNECT BY LEVEL<=10) n
WHERE t.cnt<10
AND INSTR(t.r,TO_CHAR(n.n,'X'))=0
AND NVL(DECODE(MOD(t.cnt,3),1,t.c1,2,t.c2,t.c3)-n.n,3) IN (-9,-7,-5,-3,3,5,7,9)
AND NVL(t.l-n.n,3) IN (-9,-7,-5,-3,3,5,7,9)
)
SELECT r FROM t WHERE cnt=10;
R
----------------------
2 5 8 3 A 1 6 7 4 9
2 5 A 7 8 1 4 3 6 9
2 7 4 9 A 1 6 5 8 3
2 7 A 5 4 1 8 9 6 3
2 9 4 7 6 1 A 3 8 5
2 9 6 3 4 1 8 7 A 5
9 2 5 8 7 A 3 4 1 6
9 2 7 4 5 A 1 8 3 6
9 4 1 6 7 A 3 2 5 8
9 4 7 2 1 A 5 6 3 8
9 6 1 4 3 A 7 8 5 2
9 6 3 8 1 A 5 4 7 2
12 rows selected.
|
|