2015-01-02 155 views
1

我發現了一對有趣的項目歐拉問題(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時,我可以使用一堆總的if-then-else情況來解決這個問題,但這是很嚴重的。我希望有一種比這更加pythonic的方法。有什麼建議麼?

回答

1

說一般網格大小是行由Ñ列並且可以從一個cell.Then移動到任何有效的相鄰小區可以使用方向陣列(類似於您模式)

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 */ 
    } 
} 

更乾淨這樣 我想。

1

請明確。以下變體不是更長,並且可以說比try... except IndexError:

if 0 <= row+mode[0] < len(network): 
    if 0 <= col+mode[1] < len(network[row]): 
     newEdge = (...) 
     edgesFromNewNode.append(newEdge) 
更清楚