经典的八皇后问题:
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。
把我的递归WITH稍微改写一下即可:
WITH c1 AS (
SELECT ROWNUM id, MOD(ROWNUM-1,8)+1 x,CEIL(ROWNUM/8) y FROM DUAL CONNECT BY ROWNUM<=64
)
,cells AS (
SELECT c1.id,c1.x,c1.y
,REPLACE(SYS_CONNECT_BY_PATH(CASE WHEN c1.x=c2.x OR c1.y = c2.y
OR c1.x-c2.x IN (c1.y-c2.y,c2.y-c1.y)
THEN '1'
ELSE '0'
END,',')
,',') cover
FROM c1, c1 c2
WHERE level=64
START WITH c2.id=1
CONNECT BY c1.id = PRIOR c1.id AND c2.id = PRIOR c2.id+1
)
,t(id,cover,result,lvl) AS (
SELECT id,cover,'('||x||','||y||')' AS result,1
FROM cells
--WHERE x BETWEEN 1 AND 4
-- AND y BETWEEN 1 AND 4
-- AND x <= y
UNION ALL
SELECT c2.id
,LPAD(SUBSTR(c1.cover,1,32)+SUBSTR(c2.cover,1,32),32,'0') ---- 位数太多NUMBER型不支持,所以拆成两截分别相加再拼回来
||LPAD(SUBSTR(c1.cover,33)+SUBSTR(c2.cover,33),32,'0')
,result||'('||c2.x||','||c2.y||')'
,c1.lvl+1
FROM t c1,cells c2
WHERE c1.lvl<8
AND c1.id<c2.id AND SUBSTR(c1.cover,c2.id,1)='0'
)
SELECT result FROM t
WHERE lvl=8;
RESULT
----------------------------------------------
(5,1)(2,2)(4,3)(6,4)(8,5)(3,6)(1,7)(7,8)
(3,1)(7,2)(2,3)(8,4)(6,5)(4,6)(1,7)(5,8)
(6,1)(3,2)(7,3)(2,4)(8,5)(5,6)(1,7)(4,8)
(4,1)(7,2)(3,3)(8,4)(2,5)(5,6)(1,7)(6,8)
(2,1)(7,2)(3,3)(6,4)(8,5)(5,6)(1,7)(4,8)
(6,1)(4,2)(2,3)(8,4)(5,5)(7,6)(1,7)(3,8)
(6,1)(3,2)(7,3)(2,4)(4,5)(8,6)(1,7)(5,8)
(4,1)(2,2)(7,3)(3,4)(6,5)(8,6)(1,7)(5,8)
(1,1)(6,2)(8,3)(3,4)(7,5)(4,6)(2,7)(5,8)
(6,1)(3,2)(5,3)(8,4)(1,5)(4,6)(2,7)(7,8)
(6,1)(3,2)(5,3)(7,4)(1,5)(4,6)(2,7)(8,8)
(7,1)(1,2)(3,3)(8,4)(6,5)(4,6)(2,7)(5,8)
(7,1)(3,2)(1,3)(6,4)(8,5)(5,6)(2,7)(4,8)
(6,1)(4,2)(7,3)(1,4)(3,5)(5,6)(2,7)(8,8)
(3,1)(8,2)(4,3)(7,4)(1,5)(6,6)(2,7)(5,8)
(5,1)(8,2)(4,3)(1,4)(3,5)(6,6)(2,7)(7,8)
(4,1)(8,2)(5,3)(3,4)(1,5)(7,6)(2,7)(6,8)
(3,1)(5,2)(8,3)(4,4)(1,5)(7,6)(2,7)(6,8)
(5,1)(1,2)(8,3)(6,4)(3,5)(7,6)(2,7)(4,8)
(1,1)(5,2)(8,3)(6,4)(3,5)(7,6)(2,7)(4,8)
(3,1)(6,2)(8,3)(1,4)(5,5)(7,6)(2,7)(4,8)
(6,1)(3,2)(7,3)(4,4)(1,5)(8,6)(2,7)(5,8)
(6,1)(3,2)(1,3)(7,4)(5,5)(8,6)(2,7)(4,8)
(7,1)(5,2)(3,3)(1,4)(6,5)(8,6)(2,7)(4,8)
(4,1)(7,2)(5,3)(2,4)(6,5)(1,6)(3,7)(8,8)
(7,1)(4,2)(2,3)(8,4)(6,5)(1,6)(3,7)(5,8)
(4,1)(2,2)(5,3)(8,4)(6,5)(1,6)(3,7)(7,8)
(4,1)(2,2)(8,3)(5,4)(7,5)(1,6)(3,7)(6,8)
(4,1)(6,2)(8,3)(2,4)(7,5)(1,6)(3,7)(5,8)
(5,1)(7,2)(2,3)(4,4)(8,5)(1,6)(3,7)(6,8)
(7,1)(4,2)(2,3)(5,4)(8,5)(1,6)(3,7)(6,8)
(8,1)(2,2)(4,3)(1,4)(7,5)(5,6)(3,7)(6,8)
(7,1)(2,2)(4,3)(1,4)(8,5)(5,6)(3,7)(6,8)
(4,1)(1,2)(5,3)(8,4)(2,5)(7,6)(3,7)(6,8)
(5,1)(1,2)(8,3)(4,4)(2,5)(7,6)(3,7)(6,8)
(5,1)(2,2)(8,3)(1,4)(4,5)(7,6)(3,7)(6,8)
(4,1)(6,2)(1,3)(5,4)(2,5)(8,6)(3,7)(7,8)
(2,1)(6,2)(1,3)(7,4)(4,5)(8,6)(3,7)(5,8)
(5,1)(7,2)(2,3)(6,4)(3,5)(1,6)(4,7)(8,8)
(3,1)(7,2)(2,3)(8,4)(5,5)(1,6)(4,7)(6,8)
(3,1)(1,2)(7,3)(5,4)(8,5)(2,6)(4,7)(6,8)
(5,1)(3,2)(1,3)(6,4)(8,5)(2,6)(4,7)(7,8)
(6,1)(3,2)(1,3)(8,4)(5,5)(2,6)(4,7)(7,8)
(5,1)(7,2)(1,3)(3,4)(8,5)(6,6)(4,7)(2,8)
(8,1)(2,2)(5,3)(3,4)(1,5)(7,6)(4,7)(6,8)
(3,1)(5,2)(2,3)(8,4)(1,5)(7,6)(4,7)(6,8)
(1,1)(7,2)(4,3)(6,4)(8,5)(2,6)(5,7)(3,8)
(6,1)(4,2)(7,3)(1,4)(8,5)(2,6)(5,7)(3,8)
(4,1)(2,2)(8,3)(6,4)(1,5)(3,6)(5,7)(7,8)
(4,1)(6,2)(8,3)(3,4)(1,5)(7,6)(5,7)(2,8)
(6,1)(8,2)(2,3)(4,4)(1,5)(7,6)(5,7)(3,8)
(3,1)(6,2)(8,3)(1,4)(4,5)(7,6)(5,7)(2,8)
(6,1)(2,2)(7,3)(1,4)(4,5)(8,6)(5,7)(3,8)
(4,1)(2,2)(7,3)(3,4)(6,5)(8,6)(5,7)(1,8)
(7,1)(3,2)(8,3)(2,4)(5,5)(1,6)(6,7)(4,8)
(5,1)(3,2)(8,3)(4,4)(7,5)(1,6)(6,7)(2,8)
(4,1)(7,2)(1,3)(8,4)(5,5)(2,6)(6,7)(3,8)
(5,1)(8,2)(4,3)(1,4)(7,5)(2,6)(6,7)(3,8)
(4,1)(8,2)(1,3)(5,4)(7,5)(2,6)(6,7)(3,8)
(2,1)(7,2)(5,3)(8,4)(1,5)(4,6)(6,7)(3,8)
(1,1)(7,2)(5,3)(8,4)(2,5)(4,6)(6,7)(3,8)
(2,1)(5,2)(7,3)(4,4)(1,5)(8,6)(6,7)(3,8)
(4,1)(2,2)(7,3)(5,4)(1,5)(8,6)(6,7)(3,8)
(5,1)(7,2)(1,3)(4,4)(2,5)(8,6)(6,7)(3,8)
(5,1)(3,2)(1,3)(7,4)(2,5)(8,6)(6,7)(4,8)
(5,1)(7,2)(4,3)(1,4)(3,5)(8,6)(6,7)(2,8)
(2,1)(5,2)(7,3)(1,4)(3,5)(8,6)(6,7)(4,8)
(5,1)(2,2)(4,3)(7,4)(3,5)(8,6)(6,7)(1,8)
(2,1)(4,2)(6,3)(8,4)(3,5)(1,6)(7,7)(5,8)
(3,1)(6,2)(8,3)(2,4)(4,5)(1,6)(7,7)(5,8)
(3,1)(6,2)(2,3)(5,4)(8,5)(1,6)(7,7)(4,8)
(6,1)(4,2)(1,3)(5,4)(8,5)(2,6)(7,7)(3,8)
(6,1)(3,2)(1,3)(8,4)(4,5)(2,6)(7,7)(5,8)
(8,1)(4,2)(1,3)(3,4)(6,5)(2,6)(7,7)(5,8)
(4,1)(8,2)(1,3)(3,4)(6,5)(2,6)(7,7)(5,8)
(5,1)(1,2)(4,3)(6,4)(8,5)(2,6)(7,7)(3,8)
(6,1)(1,2)(5,3)(2,4)(8,5)(3,6)(7,7)(4,8)
(4,1)(1,2)(5,3)(8,4)(6,5)(3,6)(7,7)(2,8)
(2,1)(6,2)(8,3)(3,4)(1,5)(4,6)(7,7)(5,8)
(3,1)(5,2)(2,3)(8,4)(6,5)(4,6)(7,7)(1,8)
(3,1)(6,2)(4,3)(2,4)(8,5)(5,6)(7,7)(1,8)
(8,1)(3,2)(1,3)(6,4)(2,5)(5,6)(7,7)(4,8)
(2,1)(8,2)(6,3)(1,4)(3,5)(5,6)(7,7)(4,8)
(3,1)(6,2)(4,3)(1,4)(8,5)(5,6)(7,7)(2,8)
(5,1)(7,2)(2,3)(6,4)(3,5)(1,6)(8,7)(4,8)
(3,1)(6,2)(2,3)(7,4)(5,5)(1,6)(8,7)(4,8)
(3,1)(5,2)(7,3)(1,4)(4,5)(2,6)(8,7)(6,8)
(7,1)(2,2)(6,3)(3,4)(1,5)(4,6)(8,7)(5,8)
(3,1)(6,2)(2,3)(7,4)(1,5)(4,6)(8,7)(5,8)
(5,1)(2,2)(6,3)(1,4)(7,5)(4,6)(8,7)(3,8)
(6,1)(2,2)(7,3)(1,4)(3,5)(5,6)(8,7)(4,8)
(4,1)(7,2)(5,3)(3,4)(1,5)(6,6)(8,7)(2,8)
92 rows selected.
有没有人用其他方法做一下? |