2015-10-31 106 views
2

我需要編寫一個函數def amountofNeighbours(row, column),它打印矩陣中某個元素的鄰居數量。例如,給定矩陣[[2, 3, 4], [5, 6, 7], [8, 9, 10]],元素2在位置[0] [0]處有三個相鄰元素,而在位置[1] [1]處元素6有八個相鄰元素。我不確定處理這樣的問題的最佳方式是什麼。我經歷了所有的準備去了,這給了我下面的:計算矩陣中鄰居數量的最佳方法是什麼?

def amountofNeighbours(row, column): 
    neighbours = 0 
    for i in range(row): 
     for j in range(column): 
      if i == 0 and j == 0 or i == 0 and j == column - 1: 
       neighbours = 3 
      elif i == row - 1 and j == 0 or i == row-1 and j == column - 1: 
       neighbours = 3 

      elif i > 0 and j == 0 or i == 0 and j > 0: 
       neighbours = 5 

      elif i == row - 1 and j > 0: 
       neighbours = 5 

      elif j == column - 1 and i > 0: 
       neighbours = 5 

      else: 
       neighbours = 8 

    return neighbours 

當我稱這種與amountofNeighbours(1, 1)它給了我正確的答案,即3,但如果我用amountofNeighbours(2,2)稱之爲答案應該是8,而它給了我3.任何人都有改進的想法?

回答

4

一個簡單的方法就是說:「如果細胞在角落,它有三個鄰居,否則如果它在邊緣,它有五個,否則它有八個。」

def numberOfNeighbors(rows, columns, row, column): 
    topBottom = row in (0, rows-1) 
    leftRight = column in (0, columns-1) 
    if topBottom and leftRight: 
     return 3 
    if topBottom or leftRight: 
     return 5 
    return 8 
1

您現在設計的功能不會執行您指定的功能。它需要行數和列數。然後它遍歷矩陣的所有元素並計算鄰居的數量。然後它返回最後一個計算得到的值,所以矩陣右下角的元素確實有3個鄰居。

你應該擺脫循環讓它做你想做的。澄清:

def amountofNeighbours(row, column, n_rows, n_cols): 
    neighbours = 0 
    if row == 0 and column == 0 or row == 0 and column == n_cols - 1: 
     neighbours = 3 
    elif row == n_rows - 1 and column == 0 or row == n_rows-1 and column == n_cols - 1: 
     neighbours = 3 

    elif row > 0 and column == 0 or row == 0 and column > 0: 
     neighbours = 5 

    elif row == n_rows - 1 and column > 0: 
     neighbours = 5 

    elif column == n_cols - 1 and row > 0: 
     neighbours = 5 

    else: 
     neighbours = 8 

    return neighbours 
+0

這不起作用。沒有足夠的參數。如果你擺脫了循環,我和j沒有意義。 – saulspatz

+0

我知道。 'i'和'j'沒用,應該改成'row'和'column'。 –

+0

然後你會得到像'row == row - 1'這樣的條件。你需要4個參數。兩個用於矩陣的尺寸和兩個用於單元的座標。 – saulspatz

0

一種解決方案,以避免許多的IF是從元素開始並計算圍繞它的「放大」框(3×3正方形)可能部分放置在基質的外部。

然後,你夾緊結果和返回元件的數目減一:

def neighbors(row, col, rows, cols): 
    ra, rb = row-1, row+2 
    ca, cb = col-1, col+2 
    dx = min(cb, cols) - max(0, ca) 
    dy = min(rb, rows) - max(0, ra) 
    return dx*dy - 1 

enter image description here

該圖像示出所選的元件和其周圍的放大的框。最小/最大操作將切斷多餘的正方形,留下一個2x3框,導致2 * 3-1 = 5個鄰居計數。

相關問題