Table of Contents

Cvičení 8: Fronta, zásobník

náplň cvičení

Úkol 1 Inverzní permutace

Úkol 2: třídění karet

Uvažujme hrací karty .

Napište funkci, který vzestupně třídí karty podle jejich barvy a podle jejich hodnoty.

cards = [  [3,"A"],  [3,"Q"],  [0,"2"],  [1,"10"]  ]

výsledek pro setřídění:

[  [0, "2"],  [1, "10"],  [3, "Q"],  [3, "A"]  ]

Seřaďte toto pole:

cards = [[0, 'Q'], [2, '6'], [1, 'K'], 
         [1, '8'], [2, '10'], [2, '4'], 
         [3, '4'], [0, '4'], [1, '3'], 
         [2, '5'], [0, 'K'], [3, 'A'], 
         [1, 'J'], [0, '3'], [0, '9']]

Úloha 3 Dekódování zprávy

TE*A*QYS***SEU****NI*O**

Úloha 4 Flood fill

m=[
[0,0,1,0,0,1,0,0,0,0],
[0,0,1,0,0,1,0,0,0,0],
[0,0,1,1,0,1,0,0,0,1],
[0,0,1,0,0,0,1,0,1,0],
[0,0,1,0,0,0,0,1,0,0],
[0,0,1,1,0,1,0,0,0,0],
[0,0,1,0,1,1,1,1,0,0],
[0,0,1,0,0,1,0,1,1,1],
[0,0,1,0,0,1,0,0,0,0],
[0,0,1,0,0,1,0,0,0,0] ]

Domácí úkol

Lehká varianta

m = [ [ 1,1,1], [2,2,2] ] #priklad matice 2x3, kde na 1. radku lezi kamen '1' a na 2. radku kamen s barvou '2'
print(m)                  #takto vypiste reseni

Pro načtení vstupních dat můžete využít tento program:

def readStones(filename):
    stones = []            #vystup funkce - seznam nactenych kamenu
    f = open(filename,"r")
    numRows = int(f.readline().strip())  #precti 1. radek ze souboru
    numCols = int(f.readline().strip())  #precti 2. radek ze souboru
    for line in f:
        numbers = list(map(int, line.strip().split()))  #precti vsechna cisla na dalsich radcich
        color = numbers[0]                              #prvni z nich je barva kamene
        coords = numbers[1:]                            #zbyle jsou souradnice r1 c1 ... rn cn
        cells = []                                      #prevedeme [r1,c1 ... rn,cn] na pole cells = [[r1,c1], ... [rn,cn]]
        for i in range(len(coords)//2):
            cells.append( [ coords[2*i+0], coords[2*i+1] ] )
        stones.append( [ color, cells ] )
    f.close()
    return numRows, numCols, stones;
 
M,N, stones = readStones("kameny.txt")
 
#n-ty kamen je stones[n]
#jeho barva je stones[n][0], jeho bunky jsou stones[n][1]    
 
#vypis pozic n-teho kamene:
n = 0 #napriklad chceme 0.kamen
for cellindex in range(len(stones[n][1])):
   row,col = stones[n][1][cellindex]
   print(row,col)

Příklad 1:

python3 fill_easy.py soubor.txt

pokud soubor.txt obsahuje:

5
5
6 0 4 0 5 -1 5 -1 4
5 4 2 4 1 4 0 3 1 3 2 3 0 2 1 2 0
2 6 4 7 4 7 3
3 -2 9 -3 9
4 7 10 8 10 8 11 9 10 6 10 5 10
1 4 14 4 13

Správné řešení je:

[[4, 5, 5, 1, 1], [4, 5, 5, 5, 3], [4, 5, 5, 5, 3], [4, 4, 2, 6, 6], [4, 2, 2, 6, 6]]

Vysvětlení: vstupní kameny vypadají takto (kameny jsou pro účel zobrazení posunuty, aby se vešly do obrázku):

kamen s barvou 6 kamen s barvou 5 kamen s barvou 2
kamen s barvou 3 kamen s barvou 4 kamen s barvou 1

Tyto kameny lze poskládat takto:

Příklad 2:

python3 fill_easy.py soubor.txt

pokud soubor.txt obsahuje:

5
5
3 -5 7 -6 7 -4 7 -5 8
6 -7 1 -6 1 -6 2 -5 1 -5 2 -5 3 -5 4
4 3 12 3 11 4 11
5 7 12 8 12
1 4 -5 3 -5 3 -6
2 0 -6 -1 -6 -1 -7 -2 -7 -2 -8 -1 -8

Správné řešení je:

NOSOLUTION

Vysvětlení: vstupní kameny vypadají takto:

kamen s barvou 3 kamen s barvou 6 kamen s barvou 4
kamen s barvou 5 kamen s barvou 1 kamen s barvou 2

Tyto kameny nelze posládat do matice 5×5.

Příklad 3:

python3 fill_easy.py soubor.txt

pokud soubor.txt obsahuje:

5
8
6 -1 0 -1 1 -1 -1
5 -8 10 -9 10 -9 11 -8 11 -7 10 -9 12 -7 9 -6 10 -6 11
7 -4 12 -3 12 -2 12
8 11 0 11 1 12 0 10 0 12 1 11 -1 10 1 13 1
3 10 0 10 1 10 2 11 1 11 0 10 -1
4 9 -2 9 -3 8 -3 8 -2
2 3 6 3 5 3 4 3 3 2 3
1 -9 -7 -10 -7

Správné řešení je:

[[1, 5, 5, 5, 3, 3, 3, 3], [1, 5, 5, 8, 8, 3, 3, 7], [5, 5, 8, 8, 8, 4, 4, 7], [2, 5, 5, 8, 8, 4, 4, 7], [2, 2, 2, 2, 8, 6, 6, 6]]

Vysvětlení: vstupní kameny vypadají takto:

kamen s barvou 6 kamen s barvou 5 kamen s barvou 7
kamen s barvou 8 kamen s barvou 3 kamen s barvou 4
kamen s barvou 2 kamen s barvou 1

Tyto kameny lze poskládat takto:

Těžká varianta

Příklad 1

Vstupní soubor

5
5
1 13 0 13 1 13 -1 13 2
2 3 -2 3 -1 2 -2 2 -3 3 -3 2 -4 4 -1 2 -1 2 0 3 0 4 0 4 -2 4 -3 5 0
3 -3 10 -2 11 -1 10 -3 11 -2 10 -1 11 0 10

Vstupní kameny jsou:

Kamen barva 2 Kamen barva 1 Kamen barva 3

Jedno z možných řešení:

[[2, 2, 2, 2, 2], [1, 2, 2, 2, 2], [1, 2, 2, 2, 2], [1, 3, 3, 3, 2], [1, 3, 3, 3, 3]]

Možná řešení:

Příklad 2

Vstupní soubor

3
10
4 9 -5 9 -4 10 -5 9 -3 10 -3 10 -4 8 -5
5 -9 -4 -9 -5 -8 -5 -8 -4 -9 -6 -7 -4 -7 -5
1 10 7 10 6 11 7 11 6 12 7 12 6 9 7
3 4 -5 4 -4 4 -3
2 -9 -1 -9 0 -9 1 -10 1 -11 1 -12 1

Správné řešení:

NOSOLUTION