2016-06-18 3 views
0

Я пишу код для теста черного ящика для задания. В моей функции входы представляют собой 2d-массив, а int для x и int для y и int для силы зомби. Из моей начальной позиции, если значение элемента меньше, чем сила зомби, я меняю значение элемента на -1. Чем я добираюсь до этих элементов соседей, вверх, вниз, влево и вправо (Не диагонально) и делаю то же самое с ними. Я использую try, кроме, если элемент существует, чем добавляет его в список, если он не перемещается. Из того, что я понимаю с помощью try, не остановится от добавления элемента, которого нет в массиве в списке. Вот почему я не уверен, почему я получаю ошибку индексации, когда я черную коробку проверяю свой код. Входы, которые я добавил, но я не знаю, что вводит тест черного ящика.Не уверен, что вызывает ошибку индекса в моей инструкции if

Here is my code 
population = [[9, 3, 4, 5, 4], [1, 6, 5, 8, 9], [2, 3, 7, 3, 2], [4,5,1,4,3], [4, 5, 4, 3, 9]] 
x = 2 
y = 1 
zombie = 5 



def answer(population, x, y, zombie): 
    list = [] 
    list.append([x,y]) 
    while list: 
     print list 
     front_of_list = list.pop(0) 
     x = front_of_list[0] 
     y = front_of_list[1] 
     if population[front_of_list[0]][front_of_list[1]] <= zombie and population[front_of_list[0]][front_of_list[1]] >= 0: 
      population[front_of_list[0]][front_of_list[1]] = -1 
      if x-1 >=0: 
       try: 
        population[x-1][y] 
        list.append([x-1,y]) 
       except: 
        pass 
      if y-1 >= 0: 
       try: 
        population[x][y-1] 
        list.append([x,y-1]) 
       except: 
        pass 
      if x+1 < len(population): 
       try: 
        population[x+1][y] 
        list.append([x+1,y]) 
       except: 
        pass 
      if y+1 < len(population[0]): 
       try: 
        population[x][y+1] 
        list.append([x,y+1]) 
       except: 
        pass 



answer(population, x, y, zombie) 
print population 
+0

Какая строка получает ошибку? – Barmar

+0

Скопируйте и вставьте полный ответ в свой вопрос –

+0

Я только что запустил ваш код с помощью python 2.7, и он прошел нормально –

ответ

0

Ваши try пунктов не нужны, поскольку тест if вы перед тем охватывает ситуацию. Попробуем упростить и прояснить код, чтобы убедиться, что эта проблема устраняет проблему, поскольку мы не можем воспроизвести ее напрямую.

Во-первых, вы продолжаете использовать front_of_list, когда x и y сделают; мы можем упростить предложения if, объединив тесты (функция Python); (x, y) - это, естественно, кортежи, поэтому я переключил их; вы переопределили встроенное имя list, поэтому я переключил его на array; наконец, я уменьшил тесты до циклов, чтобы уменьшить вероятность ошибок copy-n-paste. Это оставляет нас с:

def answer(population, x, y, zombie): 
    array = [(x, y)] 

    x_limit = len(population) 
    y_limit = len(population[0]) 

    while array: 
     print array 
     x, y = array.pop(0) 

     if 0 <= population[x][y] <= zombie: 

      population[x][y] = -1 

      for dx in (-1, 1): 
       if 0 <= x + dx < x_limit: 
        array.append((x + dx, y)) 

      for dy in (-1, 1): 
       if 0 <= y + dy < y_limit: 
        array.append((x, y + dy)) 

population = [ 
    [9, 3, 4, 5, 4], 
    [1, 6, 5, 8, 9], 
    [2, 3, 7, 3, 2], 
    [4, 5, 1, 4, 3], 
    [4, 5, 4, 3, 9] 
    ] 

x, y = 2, 1 

zombie = 5 

answer(population, x, y, zombie) 

print population 

подключи этого в тестовой ситуации и передать точные сообщения об ошибках, если она по-прежнему не в состоянии.

Ваш код, и это предполагает прямоугольную матрицу, если ваш 2D-массив оборван, это приведет к ошибке индексации. (Что-то, чтобы удвоить чек.)

UPDATE

Традиционный смысл х является столбцы и у есть строки но ваш код (и мой переделки) имеет это наоборот. Внутри это не имеет никакого значения, но поскольку вы передаёте x & y в качестве аргументов, с точки зрения вашего кода, который может подключиться, это может означать, что исходная точка неверна и может привести к ее недействительности. (Опять-таки, чтобы дважды проверить.)

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