#!/usr/bin/python3 # Autor: Jirka Setnička # 1. Načteme vstup N, M, start = map(int, input().split()) # načteme řádek, který rozdělíme a každý prvek převedeme na číslo (int) slovo = input() # slovo, které máme v grafu najít vrcholy = [] for i in range(N): radek = input().split() vrcholy.append({ 'id': i, 'znak': radek[0], # Sousedi jsou všechny zbylé prvky na řádku vyjma posledního. Rovnou je # taky převedeme na čísla (int) 'sousedi': list(map(int, radek[1:-1])) }) # 2. Budeme dělat prohledávání do hloubky pomocí zásobníku (tím se vyhneme # v Pythonu omezené rekurzi). Na zásobníku si vždy budeme pamatovat: # * vrchol, ve kterém jsme # * zbývající část slova, kterou ještě musíme najít (první znak uloženého slova budeme hledat v sousedech) # * sled vrcholů, kterými jsme zatím k tomuto slovu prošli # Na začátku vložíme první stav - startovní vrchol, slovo bez prvního znaku # (protože ten se nachází v tomto vrcholu) a pole obsahující jenom startovní vrchol zasobnik = [( start, slovo[1:], [start], )] reseni = [] while len(zasobnik) > 0: (v, slovo, sled) = zasobnik.pop() vrchol = vrcholy[v] # Pokud už jsme našli řešení (už nemáme, co hledat dál), tak končíme # a vypíšeme řešení if len(slovo) == 0: reseni = sled break znak = slovo[0] zbytek = slovo[1:] # Projdeme všechny sousedy for s in vrchol['sousedi']: if vrcholy[s]['znak'] == znak: # Přidáme do zásobníku k dalšímu prohledání zasobnik.append((s, zbytek, sled + [s])) # 3. Vypíšeme řešení for v in reseni: print(v)