Knight's Travail: Рекурсивно решение

Проблемът е да се създаде структура от данни, подобна на двоично дърво за търсене, което може да изброи всички възможни ходове, които един кон (в шаха) може да направи на дъска 8x8. Измислих един клас възел с текущото местоположение, родител и 8 възможни деца, които представляват 8-те възможни хода, които конят може да направи.

class KnightNode
  attr_accessor :location, :child_1, :child_2, :child_4, :child_5, :child_7, :child_8, :child_10, :child_11
  def initialize(location = nil)
    @location = location
    @parent = nil
    #8 possible children, label them as if they were hands on a clock
    @child_1 = nil
    @child_2 = nil
    @child_4 = nil
    @child_5 = nil
    @child_7 = nil
    @child_8 = nil
    @child_10 = nil
    @child_11 = nil
  end
end

def generate_tree(location)
  root = KnightNode.new(location)
  move1 = [root.location[0] + 1,root.location[1] + 2]
  move2 = [root.location[0] + 2,root.location[1] + 1]
  move4 = [root.location[0] + 2,root.location[1] - 1]
  move5 = [root.location[0] + 1,root.location[1] - 2]
  move7 = [root.location[0] - 1,root.location[1] - 2]
  move8 = [root.location[0] - 2,root.location[1] - 1]
  move10 = [root.location[0] - 2,root.location[1] - 1]
  move11 = [root.location[0] - 1,root.location[1] + 2]
  move1[0] > 7 && move1[1] > 7 ? root.child_1 = nil : root.child_1 = generate_tree(move1)
  move2[0] > 7 && move2[1] > 7 ? root.child_2 = nil : root.child_2 = generate_tree(move2)
  move4[0] > 7 && move4[1] < 0 ? root.child_4 = nil : root.child_4 = generate_tree(move4)
  move5[0] > 7 && move5[1] < 7 ? root.child_5 = nil : root.child_5 = generate_tree(move5)
  move7[0] < 0 && move7[1] < 7 ? root.child_7 = nil : root.child_7 = generate_tree(move7)
  move8[0] < 0 && move8[1] < 0 ? root.child_8 = nil : root.child_8 = generate_tree(move8)
  move10[0] < 0 && move10[1] < 0 ? root.child_10 = nil : root.child_10 = generate_tree(move10)
  move11[0] < 0 && move11[1] > 7 ? root.child_11 = nil : root.child_11 = generate_tree(move11)
  return root
end

generate_tree([3,3])

Когато стартирам този код, попадам на SystemStackError. Предполагам, че рекурсията ми преминава през безкраен цикъл, но не виждам проблема. Благодаря предварително!


person Fmak    schedule 21.06.2018    source източник


Отговори (1)


Не виждам начин наистина да прекратите търсенето. Подрязвате, ако изчезне от дъската, но трябва или изкуствено да я ограничите до 64 (брой квадратчета на дъската) и/или да проследите къде вече е посетил и да не му позволявате да посещава това поле отново.

person Leonard    schedule 21.06.2018