我发现了几个有趣的欧拉问题(81-83)。它们都是通过这个平方矩阵“寻找最短路径”的变体。我将使用djikstra的最短路径算法一次解决所有问题。它们都有自己奇怪的变化,但都可以用不同的边缘设置来建模(有些问题只能“向右和向下”移动,而另一些则是“向上/向下/向左/向右”。)
不管怎样,我想我已经写了一个简单的方法来概括边缘构造,使用一个“模式”列表来指定,对于一个给定的节点,我可以创建边缘到哪个相邻的节点此代码的片段如下:

def makeGraph(fn="smallMatrix.txt", modes = [(0,1), (0,-1), (-1,0), (1,0)]):
        for row in range(0, len(network)):
            for col in range(0, len(network[row])):
                #create edges
                edgesFromNewNode = []
                for mode in modes:
                    try:
                        #newEdge = ( edgeLength, (destination row, col)  )
                        newEdge = (    network[row+mode[0]][col+mode[1]], ( row+mode[0] , col+mode[1] ) )
                        edgesFromNewNode.append(newEdge)
                    except IndexError:
                        pass
                edgeCatalog[(row, col)] = edgesFromNewNode

所以我不明白为什么节点(0,0)(左上角的节点)有四条边——它应该只有两条有效的边(1,0)和(0,1)然后我意识到,当我将模式掩码应用于(0,0)时,我得到了(0,-1)和(-1,0)这样的东西,它们不是索引错误,而是使用列表的末尾。
在处理row=0或col=0时,我可以用一堆gross if-then-else来解决这个问题,但这是gross。我希望有一个比那更像蟒蛇的方法。有什么建议吗?

最佳答案

一般来说,网格大小是m行x n列,可以从一个单元格移动到任何有效的相邻单元格,然后可以使用方向数组(类似于您的模式)

dx[4]={0,-1,0,1} // movement in rows
dy[4]={-1,0,1,0} // movement in columns

现在假设你在x,y单元格,你想转到它们的有效相邻单元格
 int valid(int i,int j)
 {
    if(i>=0&&i<m&&j>=0&&j<n)return 1;
    return 0;
 }

 for(i=0;i<4;i++)
 {
     new_x=dx[i]+x;
     new_y=dy[i]+y;
     if( valid(new_x,new_y) )
     {
         /* new_x,new_y is valid adjacent cell
            do whatever you want to process with it  */
     }
 }

我想这样比较干净。

10-06 00:28