программа на питоне выдает неверный ответ

Рейтинг: 0Ответов: 2Опубликовано: 02.04.2023

решала следующую задачу:

Василию очень нравится клеточный автомат «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)

Заранее спасибо за помощь:)

Ответы

▲ 0
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 в одну строку.

▲ 0

Доработал ваш код, см. комментарии

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