class Board Cell = Struct.new(:value, :adj) do def self.end=(end_val) @@end = end_val end def try(seq_num) self.value = seq_num return true if seq_num==@@end a = [] adj.each_with_index do |cell, n| a << [wdof(cell.adj)*10+n, cell] if cell.value.zero? end a.sort.each {|_, cell| return true if cell.try(seq_num+1)} self.value = 0 false end def wdof(adj) adj.count {|cell| cell.value.zero?} end end def initialize(rows, cols) @rows, @cols = rows, cols unless defined? ADJACENT # default move (Knight) eval("ADJACENT = [[-1,-2],[-2,-1],[-2,1],[-1,2],[1,2],[2,1],[2,-1],[1,-2]]") end frame = ADJACENT.flatten.map(&:abs).max @board = Array.new(rows+frame) do |i| Array.new(cols+frame) do |j| (i