<<   >>

26. Knight’s Tour

 

A knight’s tour is a traversal by a knight of a chessboard, visiting each square exactly once.

The tour is here computed by depth-first search augmented by a heuristic invented by H.C. von Warnsdorf in 1823. At each step, the heuristic is to choose a successor having the fewest further moves; that is, favors children having the fewest children.

kmoves←{
  t←(,⍳⍵,⍵)∘.+↓8 2⍴2 1 2 ¯1 1 2 1 ¯2 ¯1 2 ¯1 ¯2 ¯2 1 ¯2 ¯1
  (↓∧/(↑t)∊⍳⍵)/¨↓⍵⊥¨t
}

ktourw←{
  M←↑kmoves ⍵
  b←(⍵×⍵)⍴1
  f←{(≢⍵)=≢M:⍵ ⋄ b[⊢/⍵]←0 ⋄ ∇⍵,(⊃⍋+/b[M[j;]])⌷j←{b[⍵]/⍵}M⌷⍨⊢/⍵}
  (⍵,⍵)⍴⍋f 0
  f←{b[⊢/⍵]←0 ⋄ ⍵,(⊃⍋+/b[M[j;]])⌷j←{b[⍵]/⍵}M⌷⍨⊢/⍵}
  (⍵,⍵)⍴⍋f⍣(¯1+⍵*2)⊢0                             

} 

For example:

   ktourw 8
 0 25 14 23 28 49 12 31
15 22 27 50 13 30 63 48
26  1 24 29 62 59 32 11
21 16 51 58 43 56 47 60
 2 41 20 55 52 61 10 33
17 38 53 42 57 44  7 46
40  3 36 19 54  5 34  9
37 18 39  4 35  8 45  6

ktourw is very efficient with ktourw 80 running in less than 0.1 seconds.



Appeared in J in [86] and in APL in [87].