Симуляция Python - PullRequest
       41

Симуляция Python

0 голосов
/ 16 октября 2018

Итак, у меня есть список в виде

[['0','0','0','0','0'],
['0','0','0','0','0'],
['1','0','0','0','0'],
['1','0','0','0','0'],
['0','0','0','0','0']]

, и я хочу, чтобы значение «0», окружающее «1», изменялось на «1» после шага, как это.

[['0','0','0','0','0'],
['1','0','0','0','0'],
['1','1','0','0','0'],
['1','1','0','0','0'],
['1','0','0','0','0']]

и после достаточного количества шагов все «0» становятся «1».

Код, который я имею, выглядит следующим образом

def simulate_bushfire(list, steps):
    for _ in range(steps):# iterates through the number of steps 
        for y in range(len(initial_bushfire[0])):
            for x in range(len(initial_bushfire)): #for all y coordinates possible in the file   
                if initial_bushfire[y][x] =='1':# looks for cells that has '1' in it 
                    for a in range(x-1,x+2): #looks at the neighbour of the cell that has'1' in it (x coordinates)
                        for b in range(y-1,y+2):#looks at the neighbour of the cell that has'1' in it (y coordinates)                           
                            if a<0 or b<0 or b>=len(initial_bushfire[0]) or a>=len(initial_bushfire):# if neighbour is outside the border of the map, 
                                #code will ignore to avoid errors like list out of range 
                                continue
                            if initial_bushfire[b][a]=='':# if there's an empty string (no tree)
                                continue    # ignore this as well (no trees to burn )
                            if initial_bushfire[b][a]=='0': #if there is a '0' in the file (there is a tree)
                                initial_bushfire[b][a]='1'# change the '0' to a '1' (tree on fire)
    return (initial_bushfire)

, но кажется, что «спред» слишком велик для 1 шага.Кажется, я не понимаю, почему, но я думаю, что это из-за этой строки

for a in range(x-1,x+2): #looks at the neighbour of the cell that has'1' in it (x coordinates)
    for b in range(y-1,y+2):#looks at the neighbour of the cell that has'1' in it (y coordinates)

Буду очень признателен, если кто-нибудь поможет мне с этим кодом.

1 Ответ

0 голосов
/ 16 октября 2018

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

def simulate_bushfire(initial_bushfire, steps):
    for _ in range(steps):# iterates through the number of steps
        new_fire = []
        for y in range(len(initial_bushfire[0])):
            for x in range(len(initial_bushfire)): #for all y coordinates possible in the file
                if initial_bushfire[y][x] =='1':# looks for cells that has '1' in it
                    for a, b in (x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1): #looks at the neighbouring cells
                        if a<0 or b<0 or b>=len(initial_bushfire[0]) or a>=len(initial_bushfire):# if neighbour is outside the border of the map,
                            #code will ignore to avoid errors like list out of range
                            continue
                        if initial_bushfire[b][a]=='':# if there's an empty string (no tree)
                            continue    # ignore this as well (no trees to burn )
                        if initial_bushfire[b][a]=='0': #if there is a '0' in the file (there is a tree)
                            new_fire.append((b, a))# change the '0' to a '1' (tree on fire)
        for y, x in new_fire:
            initial_bushfire[y][x] = '1'
    return (initial_bushfire)

, чтобы:

simulate_bushfire(l, 1)

вернется:

[['0', '0', '0', '0', '0'],
 ['1', '0', '0', '0', '0'],
 ['1', '1', '0', '0', '0'],
 ['1', '1', '0', '0', '0'],
 ['1', '0', '0', '0', '0']]
...