【发布时间】:2017-05-16 23:50:35
【问题描述】:
我想找到所有可能的遍历尺寸为n*m 的网格,其中遍历不能多次使用节点,并且允许移动到相邻节点(包括对角线)。
例如,1*1 网格是微不足道的;只有 1 次可能的步行,即[(0,0)]。 1*2 网格有 4 种可能的游走,即 [(0,0)]、[(0,1)]、[(0,0),(0,1)] 和 [(0,1),(0,0)]。 2*2 网格有 4 个长度为 1 的小步,分别是 [(0,0)]、[(0,1)]、[(1,0)] 和 [(1,1)],12 个长度为 2 的步 [(0,0), (0,1)]、[(0,0),(1,0)]、[(0,0),(1,1)] 等等,长度为 3 的 16 次步行([(0,0),(0,1),(1,1)] 等)和长度为 4 的 16 次步行([(0,0),(0,1),(1,1),(1,0)] 等)。
这是我在 python 中实现递归算法以列出 n*m 网格中所有可能的行走的尝试,但它没有返回正确的解决方案。我通过遍历所有起点来接近它,然后形成一个可能的后续步骤的递归树。
dim=(2,2)
walks=[]
def main():
for row in range(dim[0]):
for col in range(dim[1]):
walked=[[0 for i in range(dim[0])] for j in range(dim[1])]
walkTree(row, col, walked, [])
print(walks)
def walkTree(row, col, walked, leading):
walks.append( leading+[(row,col)] )
walked[row][col]=1
leading.append((row,col))
if row-1 >= 0:
if col-1 >= 0:
if not walked[row-1][col-1]:
walkTree(row-1, col-1, walked, leading)
if not walked[row-1][col]:
walkTree(row-1, col, walked, leading)
if col+1 < dim[1]:
if not walked[row-1][col+1]:
walkTree(row-1, col+1, walked, leading)
if col-1 >= 0:
if not walked[row][col-1]:
walkTree(row, col-1, walked, leading)
if col+1 < dim[1]:
if not walked[row][col+1]:
walkTree(row, col+1, walked, leading)
if row+1 < dim[0]:
if col-1 >= 0:
if not walked[row+1][col-1]:
walkTree(row+1, col-1, walked, leading)
if not walked[row+1][col]:
walkTree(row+1, col, walked, leading)
if col+1 < dim[1]:
if not walked[row+1][col+1]:
walkTree(row+1, col+1, walked, leading)
if __name__=='__main__':
main()
非常感谢任何关于我的代码为什么不起作用的帮助或解决此问题的更好方法。谢谢!
【问题讨论】:
-
当您说您也对“更好的方式”感兴趣时,是否包括外部包?
-
当然,只要它可以迭代所有可能的遍历。
-
您没有向我们显示错误的输出,也没有提供任何执行跟踪。你对debug这个做了什么,你从中学到了什么?
-
我在 (2,1) 和 (1,2) 网格上尝试了您的代码。在这两种情况下,它都会出现索引超出范围的故障。
-
如果这是我的问题,我会使用OEIS 并搜索self-avoiding walk。我会为您执行此操作,但至少需要序列的前四个数字。