Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在给定一些移动规则的情况下,如何枚举从棋盘的左下(a1)方开始到达右上(h8)方的唯一路径?_Python_Algorithm - Fatal编程技术网

Python 在给定一些移动规则的情况下,如何枚举从棋盘的左下(a1)方开始到达右上(h8)方的唯一路径?

Python 在给定一些移动规则的情况下,如何枚举从棋盘的左下(a1)方开始到达右上(h8)方的唯一路径?,python,algorithm,Python,Algorithm,几周前,我被要求找到所有不同且独特的方法来到达棋盘的右上角,x,y>3,从(0,0)开始,知道你只能将x和y增加+1 我仍然无法找到解释如何在棋盘上导航的算法,所以我想知道你们有什么可以推荐的吗 换言之: 如何列出从左下角(0,0)开始,用大头针到达棋盘右上角(x,y)的所有独特方法。您只能向上或向右移动pin # 2010年10月16日更新: 好的,我对DFS做了一些研究,不确定从哪里开始,然后查找树的前序遍历,我得出了这个结论,因为基本上棋盘是一棵树: #!/usr/bin/python

几周前,我被要求找到所有不同且独特的方法来到达棋盘的右上角,x,y>3,从(0,0)开始,知道你只能将x和y增加+1

我仍然无法找到解释如何在棋盘上导航的算法,所以我想知道你们有什么可以推荐的吗

换言之:

如何列出从左下角(0,0)开始,用大头针到达棋盘右上角(x,y)的所有独特方法。您只能向上或向右移动pin

# 2010年10月16日更新:

好的,我对DFS做了一些研究,不确定从哪里开始,然后查找树的前序遍历,我得出了这个结论,因为基本上棋盘是一棵树:

#!/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

它肯定会通过所有独特的路径,但我相信有一种方法可以改进它,实际打印出完整的路径。由于某种原因,我找不到一种使用递归的方法。有什么想法吗?

我建议您研究一下,当x&y都大于3时,您的搜索是成功的,并且树下的每个成功搜索路径都是有效路径。

是的,正如Bryan提到的,使用DFS。 在这种情况下,您不需要保存一个堆栈来记录您所走的路,只需要一个计数器、一个位置和一个好的算法。 例如:

int count = 0;
int x = 0;
int y = 0;
int to_x[3] = {0, 0, 0};
for(; to_x[2] < 8; counter++)
{
    for(int arridx = 0; arridx < 2; arridx++)
    {
        if(to_x[arridx] == 8)
        {
            to_x[arridx] = 0;
            to_x[arridx+1] += 1;
        }
    }
/*
    for(int arridx2 = 0; arridx2 < 3; arridx2++)
    {
        //for(; x < to_x[arridx2]; x++);
        x = to_x[arridx2];

        y++;
    }
*/
}
int count=0;
int x=0;
int y=0;
int到_x[3]={0,0,0};
对于(;to_x[2]<8;计数器++)
{
对于(int-arridx=0;arridx<2;arridx++)
{
if(to_x[arridx]==8)
{
to_x[arridx]=0;
to_x[arridx+1]+=1;
}
}
/*
for(int-arridx2=0;arridx2<3;arridx2++)
{
//for(;x

这真的只是一道数学题,但如果你不想让你的头太痛,就这么做。

有(x+y)/x/Y(x+yCx)到达那里的方法。到达每一点的方法的数量只是到达点旁边/下面的方法的数量之和。

好的,经过一点研究,我得出了以下结论:

#!/usr/bin/python

chess_board = {'A': ['B', 'C'],
               'B': ['D', 'E'],
               'C': ['E', 'F'],
               'D': ['G'],
               'E': ['G', 'H'],
               'F': ['H'],
               'G': ['I'],
               'H': ['I'],
               'I': []} 


def find_all_paths(graph, start, end, path=[]):
  path = path + [start]
  if start == end:
    return [path]
  paths = []
  for node in graph[start]:
    if node not in path:
      new_paths = find_all_paths(graph, node, end, path)
      for new_path in new_paths:
        paths.append(new_path)
  return paths

all_path =  find_all_paths(chess_board, 'A', 'I')
for path in all_path:
  print path
这就是输出:

>> python chess_bfs.py 
['A', 'B', 'D', 'G', 'I']
['A', 'B', 'E', 'G', 'I']
['A', 'B', 'E', 'H', 'I']
['A', 'C', 'E', 'G', 'I']
['A', 'C', 'E', 'H', 'I']
['A', 'C', 'F', 'H', 'I']

要使接缝工作正常,我唯一的问题是,如果我需要在棋盘上添加更多节点,那么我必须手动操作。

@Jason:不,只是好奇而已。我离开大学很久了:)@muntoo:我更新了描述,希望这有帮助。我想你是指(x+y)/(x!y!)问题是列表,而不仅仅是计数。谢谢布莱恩。我提出了一种解决方案,我在页面底部添加了一种解决方案。我用的是BFS。你知道如何改进代码吗?你正在使用DFS?无论如何,现在就开始考虑修剪:为当前距离目标的最大距离设置一个全局状态(变量)。如果任何节点离它更远,只需将其从搜索树中删除即可。这基本上是alpha-beta修剪。