Район Мура в питоне

У меня есть сетка в виде кортежа кортежей с целыми числами (1/0), номер строки и номер столбца для ячейки в виде целых чисел. И я должен найти, сколько соседних ячеек имеет соседей как целое число.

Это задание с www.checkio.org, интересного сайта по изучению python.

Вот мой код:

def count_neighbours(grid, row, col):
    grid = ()
    count = 0
    for pos in ((row - 1, col), (row + 1, col), (row, col - 1), (row, col + 1), (row - 1, col - 1), (row - 1, col + 1), (row + 1, col - 1), (row + 1, col + 1)):
        if pos == 1:
            count += 1
    return count

Система мне отвечает, что рядом с выбранной ячейкой нет соседей. Пожалуйста, объясните мне, что не так и спасибо за внимание!


person laVitaEBella    schedule 09.11.2014    source источник
comment
Я вижу две очевидные ошибки: 1) вы заменили grid пустым кортежем и 2) ваш код вообще не ссылается на переменную grid, вы просто добавляете 1 к count, если pos равно 1. pos никогда не будет равно 1, потому что вы устанавливаете его в один из наборов кортежей. Следовательно, ваша функция всегда будет возвращать 0, пока row и col являются числовыми (и в противном случае вызовет исключение).   -  person Martijn Pieters    schedule 09.11.2014


Ответы (1)


Я вижу две очевидные ошибки:

  1. вы заменили grid пустым кортежем

  2. ваш код вообще не ссылается на переменную grid, вы просто добавляете 1 к count, если pos равно 1. pos никогда не будет равно 1, потому что вы устанавливаете его в один из ряда кортежей.

Следовательно, ваша функция всегда будет возвращать 0, пока row и col являются числовыми (и в противном случае вызовет исключение).

Вам нужно фактически ссылаться на сетку, которая передается:

def count_neighbours(grid, row, col):
    count = 0
    for pos in (
            (row - 1, col), (row + 1, col), (row, col - 1),
            (row, col + 1), (row - 1, col - 1), (row - 1, col + 1),
            (row + 1, col - 1), (row + 1, col + 1)):
        if grid[pos[0]][pos[y]] == 1:
            count += 1
    return count

Я предполагаю, что сетка представляет собой список списков, представляющих строки и ячейки.

Далее вам придется обрабатывать свои позиции, выходящие за пределы; нет соседей сверху первой строки, например:

def count_neighbours(grid, row, col):
    count = 0
    for x, y in (
            (row - 1, col), (row + 1, col), (row, col - 1),
            (row, col + 1), (row - 1, col - 1), (row - 1, col + 1),
            (row + 1, col - 1), (row + 1, col + 1)):
        if not (0 <= x < len(grid) and 0 <= y < len(grid[x])):
            # out of bounds
            continue
        if grid[x][y] == 1:
            count += 1
    return count
person Martijn Pieters    schedule 09.11.2014
comment
Большое спасибо, но это не работает. Может быть, из-за предпосылок я забыл об этом. Предварительное условие: 3 ≤ len(grid) ≤ 10 all(len(grid[0]) == len(row) для строки в сетке) - person laVitaEBella; 09.11.2014
comment
@laVitaEBella: Эти предварительные условия не проблема; вы не определили четко, какие данные вводятся и какие ожидаются на выходе; в вашем вопросе нет тестовых случаев. И это не работает тоже ничего не значит. Как это не работает? Для каких входов? Какой результат ожидался и что вы получили вместо этого? - person Martijn Pieters; 10.11.2014
comment
Прошу прощения за очень плохое объяснение проблемы. Я успешно преодолел тесты, в которых размеры кортежей были 5x5, и остановился на кортеже 3x3. Еще один пример: count_neighbours(((1, 1, 1), (1, 1, 1), (1, 1, 1),), 0, 2) == 3 (соседи), проблема: IndexError: индекс кортежа вне допустимого диапазона - person laVitaEBella; 10.11.2014
comment
@laVitaEBella У меня была ошибка при проверке верхних границ; исправлено сейчас. Можешь попробовать еще раз? - person Martijn Pieters; 10.11.2014
comment
Большое спасибо, г-н. Питерс, теперь все в порядке. Я тебе очень благодарна. Наверное, мне нужно учиться усерднее, потому что задача в этом вопросе была не очень сложной. Спасибо за помощь! - person laVitaEBella; 10.11.2014