我发现了几个有趣的欧拉问题(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 */
}
}
我想这样比较干净。