2015-10-31 7 views
2

Мне нужно написать функцию def amountofNeighbours(row, column), которая печатает количество соседей в определенном элементе в матрице. Например, учитывая матрицу [[2, 3, 4], [5, 6, 7], [8, 9, 10]], в элементе 2 в положении [0] [0] находятся три соседи, а в элементе 6 в положении [1] [1] имеется восемь соседей. Я не уверен, что лучший способ справиться с такой проблемой. Я прошел через все возможности, и это дало мне следующее:Лучший способ вычислить количество соседей в матрице?

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

Прямой способ сделать это - сказать: «Если ячейка находится в углу, она имеет трех соседей, иначе, если она находится на краю, она имеет пять, иначе она имеет 8."

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

Это не работает. Недостаточно параметров. Если вы избавитесь от циклов, i и j не имеют никакого значения. – saulspatz

+0

Я знаю. 'i' и' j' бесполезны и должны быть изменены на 'row' и' column'. –

+0

Затем вы получаете такие условия, как 'row == row - 1'. Вам нужно 4 параметра. Два для размеров матрицы и два для координат ячейки. – saulspatz

0

Одно решение, чтобы избежать многих IFs, чтобы начать с элемента и вычислить «увеличенный» рамку вокруг него (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

Изображение показывает выбранный элемент и увеличенное поле вокруг него. Операция min/max отключит дополнительные квадраты, оставляя поле 2x3, в результате получится 2 * 3-1 = 5 соседей.

Смежные вопросы