программа на питоне выдает неверный ответ
решала следующую задачу:
Василию очень нравится клеточный автомат «Game of life», поэтому он решил попробовать придумать что-то подобное. Для простоты, Василий решил определить свой клеточный автомат на массиве из n ячеек, каждый элемент которого может быть в живом или неживом состоянии.
Эволюция массива в клеточном автомате Василия происходит итеративно следующим образом:
Если у неживого элемента есть ровно 1 живой сосед в текущем состоянии массива, то на следующей итерации он станет живым. Соседями для элемента на позиции i являются элементы на позициях i−1 и i+1 , если соседа на такой позиции не существует, то считается, что он мертв. Василий — гуманист, поэтому все живые элементы в его автомате остаются живыми. Смотрите секцию примечание для примеров эволюции.
Вам дано некоторое начальное состояние всех элементов, и вам нужно помочь Василию определить, каким будет состояние массива через m итераций эволюции.
Входные данные
Во входных данных находятся несколько наборов входных данных. В первой строке находится одно целое число t (1≤t≤103 ) — количество наборов входных данных. Далее следуют наборы входных данных.
Первая строка набора входных данных содержит два целых числа n и m (2≤n≤103,1≤m≤109 ) — количество ячеек в массиве и количество итераций.
Вторая строка набора входных данных содержит строку длины n из «0» и «1» — описание начального состояния. «1» обозначает живую клетку, а «0» — неживую.
Гарантируется, что сумма значений n по всем наборам входных данных не превосходит 104 .
Выходные данные
Для каждого набора входных данных выведите строку из n символов «0» и «1» — состояние массива через m итераций эволюции.
Пример
Входные данные
4
11 3
01000000001
10 2
0110100101
5 2
10101
3 100
000
Выходные данные
11111001111
1110111101
10101
000
Написала по ней код, но он выдает неверный ответ, помогите пожалуйста исправить!!! Мой код:
n=int(input())
a=["1"]
b=["0"]
for i in range(n):
kol, it=map(int, input().split(" "))
st=input()
st=st+"0"
st=list(st)
q=[]
for j in range(len(st)):
if j!=0:
if st[0]=="0":
if (st[j-1]=="1" and st[j+1]=="0") or (st[j-1]=="0" and ast[j+1]=="1"):
q.append(a)
else:
q.append(b)
else:
q.append(a)
elif j==0:
if st[j]=="0":
if st[j+1]=="1":
q.append(a)
else:
q.append(b)
else:
q.append(a)
elif j==len(st)-1:
if st[j]=="0":
if st[j-1]=="1":
q.append(a)
else:
q.append(b)
else:
q.append(a)
st=q
q=[]
print(st)
Заранее спасибо за помощь:)
Ответы (2 шт):
t = int(input())
for _ in range(t):
n, m = map(int, input().split())
state = input().strip()
state = list(map(int, state))
for _ in range(m):
new_state = [0]*n
for i in range(n):
count = 0
if i > 0 and state[i-1] == 1:
count += 1
if i < n-1 and state[i+1] == 1:
count += 1
if count == 1:
new_state[i] = 1
elif count == 2 and state[i] == 1:
new_state[i] = 1
state = new_state
print(''.join(map(str, state)))
Сначала мы считываем количество тестовых случаев t. Затем для каждого тестового случая мы считываем количество ячеек n, количество итераций m и начальное состояние массива state. Затем мы преобразуем строку state в список state из целых чисел 0 и 1.
Далее мы выполняем цикл for для m итераций. На каждой итерации мы создаем новый список new_state из нулей длиной n. Затем мы выполняем еще один цикл for для каждого элемента i в state. Для каждого элемента мы проверяем его соседей слева и справа и подсчитываем количество живых соседей count. Если count равен 1, то элемент становится живым в новом состоянии new_state. Если count равен 2 и элемент уже был живым, то он остается живым в новом состоянии. После завершения внутреннего цикла мы присваиваем переменной state значение new_state.
Наконец, мы выводим конечное состояние state в виде строки из 0 и 1, используя метод join() для объединения элементов списка state в одну строку.
Доработал ваш код, см. комментарии
data = """4
11 3
01000000001
10 2
0110100101
5 2
10101
3 100
000""".split('\n')
def input(): # чтобы не вводить руками данные
global data
return data.pop(0)
n = int(input())
a = "1" # список не нужен
b = "0" # список не нужен
for i in range(n):
kol, it = map(int, input().split(" "))
st = input()
# st=st+"0" - лишнее
st = list(st)
for k in range(it): # забыли цикл с итерациями
q = [] # перенести сюда
for j in range(kol):
if 0 < j < kol - 1: # здесь так
if st[j] == "0":
if (st[j - 1] == "1" and st[j + 1] == "0") or (st[j - 1] == "0" and st[j + 1] == "1"):
q.append(a)
else:
q.append(b)
else:
q.append(a)
elif j == 0:
if st[j] == "0":
if st[j + 1] == "1":
q.append(a)
else:
q.append(b)
else:
q.append(a)
elif j == kol - 1:
if st[j] == "0":
if st[j - 1] == "1":
q.append(a)
else:
q.append(b)
else:
q.append(a)
st = q
# q=[] - лишнее
print(''.join(st))
11111001111
1110111101
10101
000