⍝ The N-queens Chess problem:
3 4⍴queens 8
┌───────────────┬───────────────┬───────────────┬───────────────┐
│⍟ · · · · · · ·│⍟ · · · · · · ·│· ⍟ · · · · · ·│· ⍟ · · · · · ·│
│· · · · ⍟ · · ·│· · · · · ⍟ · ·│· · · ⍟ · · · ·│· · · · ⍟ · · ·│
│· · · · · · · ⍟│· · · · · · · ⍟│· · · · · ⍟ · ·│· · · · · · ⍟ ·│
│· · · · · ⍟ · ·│· · ⍟ · · · · ·│· · · · · · · ⍟│⍟ · · · · · · ·│
│· · ⍟ · · · · ·│· · · · · · ⍟ ·│· · ⍟ · · · · ·│· · ⍟ · · · · ·│
│· · · · · · ⍟ ·│· · · ⍟ · · · ·│⍟ · · · · · · ·│· · · · · · · ⍟│
│· ⍟ · · · · · ·│· ⍟ · · · · · ·│· · · · · · ⍟ ·│· · · · · ⍟ · ·│
│· · · ⍟ · · · ·│· · · · ⍟ · · ·│· · · · ⍟ · · ·│· · · ⍟ · · · ·│
├───────────────┼───────────────┼───────────────┼───────────────┤
│· ⍟ · · · · · ·│· ⍟ · · · · · ·│· ⍟ · · · · · ·│· ⍟ · · · · · ·│
│· · · · ⍟ · · ·│· · · · · ⍟ · ·│· · · · · ⍟ · ·│· · · · · · ⍟ ·│
│· · · · · · ⍟ ·│⍟ · · · · · · ·│· · · · · · · ⍟│· · ⍟ · · · · ·│
│· · · ⍟ · · · ·│· · · · · · ⍟ ·│· · ⍟ · · · · ·│· · · · · ⍟ · ·│
│⍟ · · · · · · ·│· · · ⍟ · · · ·│⍟ · · · · · · ·│· · · · · · · ⍟│
│· · · · · · · ⍟│· · · · · · · ⍟│· · · ⍟ · · · ·│· · · · ⍟ · · ·│
│· · · · · ⍟ · ·│· · ⍟ · · · · ·│· · · · · · ⍟ ·│⍟ · · · · · · ·│
│· · ⍟ · · · · ·│· · · · ⍟ · · ·│· · · · ⍟ · · ·│· · · ⍟ · · · ·│
├───────────────┼───────────────┼───────────────┼───────────────┤
│· ⍟ · · · · · ·│· · ⍟ · · · · ·│· · ⍟ · · · · ·│· · ⍟ · · · · ·│
│· · · · · · ⍟ ·│· · · · ⍟ · · ·│· · · · ⍟ · · ·│· · · · · ⍟ · ·│
│· · · · ⍟ · · ·│· ⍟ · · · · · ·│· · · · · · · ⍟│· ⍟ · · · · · ·│
│· · · · · · · ⍟│· · · · · · · ⍟│· · · ⍟ · · · ·│· · · · ⍟ · · ·│
│⍟ · · · · · · ·│⍟ · · · · · · ·│⍟ · · · · · · ·│· · · · · · · ⍟│
│· · · ⍟ · · · ·│· · · · · · ⍟ ·│· · · · · · ⍟ ·│⍟ · · · · · · ·│
│· · · · · ⍟ · ·│· · · ⍟ · · · ·│· ⍟ · · · · · ·│· · · · · · ⍟ ·│
│· · ⍟ · · · · ·│· · · · · ⍟ · ·│· · · · · ⍟ · ·│· · · ⍟ · · · ·│
└───────────────┴───────────────┴───────────────┴───────────────┘
1 disp queens¨0 1 2 3 4
┌→──┬───┬─────┬───────┬─────────┐
│┌⊖┐│┌→┐│┌⊖──┐│┌⊖────┐│┌→──────┐│
││ ⌽││⍟↓││ ⌽││ ⌽││· ⍟ · ·││
│└⊖┘│└→┘│└──→┘│└────→┘││· · · ⍟││
│ │ │ │ ││⍟ · · ·││
│ │ │ │ ││· · ⍟ ·↓│
│ │ │ │ │└──────→┘│
└──⊖┴──→┴────⊖┴──────⊖┴────────→┘
⍝ Alternative codings:
⍝ One-liner for 5-queens:
⎕io←0
{⍵{↑¨↓↓(2|1↓⍳2×⍺)\((↑⍵)∘.=⍳⍺)⊃¨⊂'·⍟'}∪{{(⊃⍋↑⍵)⊃⍵},↑⍵}¨{{⍋⍵}\2/⊂⍵}¨∘{{⍒⍵}\4/⊂⍵}¨⍵{(⍺=,↑⍴¨⍵)/⍵},¨↑⍬{↑(⍺⍺,⍺)∇∇(1↓⍵⍵~¨⍺+(1+⍳⍴⍵⍵)×⊂¯1 0 1)/((⊃⍵⍵)~⍺+¯1 0 1),⊂⍵,⊂⍺⍺,⍺}(1↓⍵⍴⊂⌽⍳⍵)/(⌽⍳⌈⍵÷2),⊂0⍴⊂⍬}5
┌─────────┬─────────┐
│⍟ · · · ·│· ⍟ · · ·│
│· · ⍟ · ·│· · · · ⍟│
│· · · · ⍟│· · ⍟ · ·│
│· ⍟ · · ·│⍟ · · · ·│
│· · · ⍟ ·│· · · ⍟ ·│
└─────────┴─────────┘
⍝ Roger Hui's one-liner for 5-queens:
⎕io←0
{⍵{((+/b)⌿⍵),⍺|(,b)/⍳×/⍴b←~↑(⊂⍳⍺)∊¨(↓⍵)+[0]¨⊂(c-⍳c←1↓⍴⍵)∘.ׯ1 0 1}⍣⍵⍳1 0}5
0 2 4 1 3
0 3 1 4 2
1 3 0 2 4
1 4 2 0 3
2 0 3 1 4
2 4 1 3 0
3 0 2 4 1
3 1 4 2 0
4 1 3 0 2
4 2 0 3 1
⍝ Alternative coding, which uses the →trav← DFS operator:
qtrav←{ ⍝ N-queens using →trav← operator.
subs←{(⊂⍵),¨(⍳⍴⊃⍺)~atk ⍵} ⍝ sub-trees of tree-node ⍵.
accm←{⍺,((⍴⍵)=⍴⊃⍺)/⊂⍵} ⍝ accumlation of N-placement.
atk←{↑(⊂⍵)+¯1 0 1×⊂⌽⍳⍴⍵} ⍝ columns under attack in row 1+⍵.
fmt←{⍵∘.=⍳⍴⍵} ⍝ formatted as bool matrix.
fmt¨(↓0 ⍵⍴0)accm trav subs ⍬ ⍝ formatted solutions.
}
⎕io←1
2 5⍴ qtrav 5
┌─────────┬─────────┬─────────┬─────────┬─────────┐
│1 0 0 0 0│1 0 0 0 0│0 1 0 0 0│0 1 0 0 0│0 0 1 0 0│
│0 0 1 0 0│0 0 0 1 0│0 0 0 1 0│0 0 0 0 1│1 0 0 0 0│
│0 0 0 0 1│0 1 0 0 0│1 0 0 0 0│0 0 1 0 0│0 0 0 1 0│
│0 1 0 0 0│0 0 0 0 1│0 0 1 0 0│1 0 0 0 0│0 1 0 0 0│
│0 0 0 1 0│0 0 1 0 0│0 0 0 0 1│0 0 0 1 0│0 0 0 0 1│
├─────────┼─────────┼─────────┼─────────┼─────────┤
│0 0 1 0 0│0 0 0 1 0│0 0 0 1 0│0 0 0 0 1│0 0 0 0 1│
│0 0 0 0 1│1 0 0 0 0│0 1 0 0 0│0 1 0 0 0│0 0 1 0 0│
│0 1 0 0 0│0 0 1 0 0│0 0 0 0 1│0 0 0 1 0│1 0 0 0 0│
│0 0 0 1 0│0 0 0 0 1│0 0 1 0 0│1 0 0 0 0│0 0 0 1 0│
│1 0 0 0 0│0 1 0 0 0│1 0 0 0 0│0 0 1 0 0│0 1 0 0 0│
└─────────┴─────────┴─────────┴─────────┴─────────┘
⍝∇ queens trav
Back to: code
Back to: Workspaces