骨のダイスを転がそう
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
こんな馬鹿な解じゃなくてもっとスマートな方法がありそうなもんだが
[ツッコミを入れる]