Несколько недель назад меня попросили найти все разные и уникальные способы достижения правой верхней части шахматной доски, с x, y> 3, начиная с (0, 0), зная, что вы можете только увеличить х и у на +1.
Я до сих пор не смог найти алгоритмы, которые объясняли бы, как перемещаться по шахматной доске, поэтому мне было интересно, есть ли у вас, ребята, что-нибудь порекомендовать?
Другими словами:
Как бы вы перечислили все уникальные способы достижения верхней правой (x, y) шахматной доски с булавкой, начиная с нижнего левого (0, 0). Вы можете только переместить свою булавку вверх или вправо?
#
Обновление от 16.10.2010:
Хорошо, поэтому я провел небольшое исследование в DFS и не был уверен, с чего начать, а потом посмотрел PreOrder Traversal a Tree, и я придумал это, поскольку в основном шахматная доска - это дерево: 1011 *
#!/usr/bin/python
class Node(object):
value = None
left = None
right = None
def SetValue(self, value):
self.value = value
def SetLeftNode(self, node):
self.left = node
def SetRightNode(self, node):
self.right = node
def main():
a = Node()
a.SetValue((0,0))
b = Node()
b.SetValue((1,0))
c = Node()
c.SetValue((2,0))
d = Node()
d.SetValue((0,1))
e = Node()
e.SetValue((1,1))
f = Node()
f.SetValue((2,1))
g = Node()
g.SetValue((0,2))
h = Node()
h.SetValue((1,2))
i = Node()
i.SetValue((2,2))
a.SetLeftNode(b)
a.SetRightNode(d)
b.SetLeftNode(g)
b.SetRightNode(e)
c.SetLeftNode(f)
c.SetRightNode(None)
d.SetLeftNode(e)
d.SetRightNode(c)
e.SetLeftNode(h)
e.SetRightNode(f)
f.SetLeftNode(i)
f.SetRightNode(None)
g.SetLeftNode(None)
g.SetRightNode(h)
h.SetLeftNode(None)
h.SetRightNode(i)
i.SetLeftNode(None)
i.SetRightNode(None)
PreOrderTraversal(a)
def PreOrderTraversal(node):
if not node:
return None
print node.value
if node.value == (2,2):
print 'Reached i'
PreOrderTraversal(node.left)
PreOrderTraversal(node.right)
main()
Вывод этого следующий:
(0, 0)
(1, 0)
(0, 2)
(1, 2)
(2, 2)
Reached i
(1, 1)
(1, 2)
(2, 2)
Reached i
(2, 1)
(2, 2)
Reached i
(0, 1)
(1, 1)
(1, 2)
(2, 2)
Reached i
(2, 1)
(2, 2)
Reached i
(2, 0)
(2, 1)
(2, 2)
Reached i
Это определенно проходит через весь уникальный путь, но я уверен, что есть способ улучшить это, чтобы фактически распечатать полный путь. По какой-то причине я не могу найти способ сделать это с помощью рекурсии. Есть идеи?