'ValueError: слишком много значений для распаковки' - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь написать базовую версию тральщика. Вы получаете количество строк, столбцов, бомб и их местоположение от пользователя.Вы должны посчитать количество бомб, окружающих каждый элемент.рассмотрим пример ниже: input

4 3
5
1 1
4 3
1 3
4 2
3 2

output is:

* 2 *
2 3 2
2 * 3
2 * *

Вот мой код:

n, m = [int(x) for x in input().split()]


k = int(input()) #number of bombs

#location of bombs
bomb = []
for i in range(k):
    r,c = [int(r) - 1 for r in input().split()]
    bomb.append([r,c])

#making the grid
map = []
for x in range(n):
    map.append([])
    for y in range(m):
        map[x].append(0)

#locate bombs       
for i, j in bomb:
    map[i][j] = '*'

#count the bombs
Ns = 0
for i, j in map:
    for x in range(-1, 2):
        for y in range(-1, 2):
            if map[i + x][j + y] == '*':
                Ns += 1

    map[i][j] = Ns

print(map)

Моя проблема - найти бомбы при сдаче.Я получаю ValueError: too many values to unpack for line 25.Любая идея, как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

В вашем коде есть две потенциальные проблемы.

Во-первых, ваша карта на самом деле имеет 3 значения для распаковки для каждого значения (так как ваш m равно 3), а не два.Это строка, которую вам нужно исправить:

for i, j in map:

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

for x in range(len(map)):
    for y in range(len(map[i])):
        square = map[x][y]

Во-вторых, ваш код для проверки окружения может столкнуться с проблемами, потому что вы просто уменьшаете / увеличиваете x и y шахты на 1, это заставит ваш код попытаться найти индексы на карте, которая не существует!Например.если х равен 2, увеличение на 1 даст вам 3, ломая ваш список.

Что вам, вероятно, нужно:

for i in range(max(0,x-1),min(x+1,n-1)+1):
    for j in range(max(0,y-1),min(y+1,m-1)+1):

Это принимает только те значения, которые находятся в окружении, и не нарушает границы массива.Max (0, x-1) препятствует тому, чтобы мы дали отрицательные границы массива, и min (x + 1, n-1) препятствует тому, чтобы мы перешли границы максимального массива.Аналогично, для y.

в сочетании код, вероятно, будет выглядеть примерно так:

#count the bombs
for x in range(len(map)):
    for y in range(len(map[i])):
        # if x,y is not a mine
        if map[x][y] != '*':
            # check the surroundings of x,y for mines
            Ns = 0
            for i in range(max(0,x-1),min(x+1,n-1)+1):
                for j in range(max(0,y-1),min(y+1,m-1)+1):
                    # if this surrounding block is a mine, add to Ns
                    if (map[i][j]) == '*':
                        Ns += 1
                        print("Not safe: " + str(Ns))
            # append the Ns number to the x,y block
            map[x][y] = Ns

for layer in map:
    print(layer)

Выходы:

['*', 2, '*']
[2, 3, 2]
[2, '*', 3]
[2, '*', '*']

Обратите внимание, что это определенно не самыйоптимизированное решение проблемы;лучший способ - сохранять значения по мере продвижения, чтобы нам не нужно было проверять все 3–8 окружающих плиток на каждую плитку, но, надеюсь, это поможет вам понять базовый вариант работы с тральщиком.

Надеюсь, это поможет!

0 голосов
/ 19 сентября 2019
for i, j in map:

недействительно.map - это список списков, похожий на массив 4x3.

Вы, похоже, пытаетесь перебрать индексы map, и перепутали их с содержимым списка.Попробуйте

for i in range(len(map)):
    for j in range(len(map[i])):
        ...
...