骨のダイスを転がそう
2010-11-03
_ [SQL] SQL で 8クイーン
ふと思い立って。
| Cell |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
に対して
WITH E1 AS (
SELECT E.Cell I
FROM eight_queen E
),
E2 AS (
SELECT E1.*,
E.Cell II
FROM eight_queen E,E1
WHERE E1.I <> E.Cell
AND E1.I + 1 <> E.Cell
AND E1.I - 1 <> E.Cell
),
E3 AS (
SELECT E2.*,
E.Cell III
FROM eight_queen E,E2
WHERE E2.I <> E.Cell
AND E2.I + 2 <> E.Cell
AND E2.I - 2 <> E.Cell
AND E2.II <> E.Cell
AND E2.II + 1 <> E.Cell
AND E2.II - 1 <> E.Cell
),
E4 AS (
SELECT E3.*,
E.Cell IV
FROM eight_queen E,E3
WHERE E3.I <> E.Cell
AND E3.I + 3 <> E.Cell
AND E3.I - 3 <> E.Cell
AND E3.II <> E.Cell
AND E3.II + 2 <> E.Cell
AND E3.II - 2 <> E.Cell
AND E3.III <> E.Cell
AND E3.III + 1 <> E.Cell
AND E3.III - 1 <> E.Cell
),
E5 AS (
SELECT E4.*,
E.Cell V
FROM eight_queen E,E4
WHERE E4.I <> E.Cell
AND E4.I + 4 <> E.Cell
AND E4.I - 4 <> E.Cell
AND E4.II <> E.Cell
AND E4.II + 3 <> E.Cell
AND E4.II - 3 <> E.Cell
AND E4.III <> E.Cell
AND E4.III + 2 <> E.Cell
AND E4.III - 2 <> E.Cell
AND E4.IV <> E.Cell
AND E4.IV + 1 <> E.Cell
AND E4.IV - 1 <> E.Cell
),
E6 AS (
SELECT E5.*,
E.Cell VI
FROM eight_queen E,E5
WHERE E5.I <> E.Cell
AND E5.I + 5 <> E.Cell
AND E5.I - 5 <> E.Cell
AND E5.II <> E.Cell
AND E5.II + 4 <> E.Cell
AND E5.II - 4 <> E.Cell
AND E5.III <> E.Cell
AND E5.III + 3 <> E.Cell
AND E5.III - 3 <> E.Cell
AND E5.IV <> E.Cell
AND E5.IV + 2 <> E.Cell
AND E5.IV - 2 <> E.Cell
AND E5.V <> E.Cell
AND E5.V + 1 <> E.Cell
AND E5.V - 1 <> E.Cell
),
E7 AS (
SELECT E6.*,
E.Cell VII
FROM eight_queen E,E6
WHERE E6.I <> E.Cell
AND E6.I + 6 <> E.Cell
AND E6.I - 6 <> E.Cell
AND E6.II <> E.Cell
AND E6.II + 5 <> E.Cell
AND E6.II - 5 <> E.Cell
AND E6.III <> E.Cell
AND E6.III + 4 <> E.Cell
AND E6.III - 4 <> E.Cell
AND E6.IV <> E.Cell
AND E6.IV + 3 <> E.Cell
AND E6.IV - 3 <> E.Cell
AND E6.V <> E.Cell
AND E6.V + 2 <> E.Cell
AND E6.V - 2 <> E.Cell
AND E6.VI <> E.Cell
AND E6.VI + 1 <> E.Cell
AND E6.VI - 1 <> E.Cell
),
E8 AS (
SELECT E7.*,
E.Cell VIII
FROM eight_queen E,E7
WHERE E7.I <> E.Cell
AND E7.I + 7 <> E.Cell
AND E7.I - 7 <> E.Cell
AND E7.II <> E.Cell
AND E7.II + 6 <> E.Cell
AND E7.II - 6 <> E.Cell
AND E7.III <> E.Cell
AND E7.III + 5 <> E.Cell
AND E7.III - 5 <> E.Cell
AND E7.IV <> E.Cell
AND E7.IV + 4 <> E.Cell
AND E7.IV - 4 <> E.Cell
AND E7.V <> E.Cell
AND E7.V + 3 <> E.Cell
AND E7.V - 3 <> E.Cell
AND E7.VI <> E.Cell
AND E7.VI + 2 <> E.Cell
AND E7.VI - 2 <> E.Cell
AND E7.VII <> E.Cell
AND E7.VII + 1 <> E.Cell
AND E7.VII - 1 <> E.Cell
)
SELECT * FROM E8 ORDER BY I,II,III,IV,V,VII,VIII
こんな馬鹿な解じゃなくてもっとスマートな方法がありそうなもんだが
[ツッコミを入れる]