Table of Contents

Cvičení 10, Stavový prostor a objekty v Pythonu

náplň cvičení

Quick test 1 - data

slovnik.txt

Úloha 1 Přelévání nádob

Mějme tři nádoby o objemu 2, 5, 9. S nádobami můžeme provádět následující akce:

Napište program, který najde nejmenší počet kroků takový, že v poslední nádobě bude objem 6.

Úloha 2: Nejkratší cesta v grafu

Mějme orientovaný graf, který má uzly očíslované od 1 do N. Hrany v tomto grafu jsou zadány ve speciálním souboru, který na jedné řádce obsahuje definici jedné hrany, tedy dvě čísla:

Napište program path.py, který z příkazové řádky načte jméno souboru s definicí hran a číslo startovního uzlu a číslo koncového uzlu. Program vytiskne jednu z nejkratších cest ze startovního uzlu do cílového uzlu.

Program otestujte na tomto souboru:

1 2
1 9
2 3
2 6
3 4
3 8
4 6
4 1
5 4
5 8
6 8
6 9
7 4
7 5
8 7
8 3
9 5
9 1

Výsledek pro cestu z uzlu 2 do uzlu 5 je:

2 6 9 5

Úkol 3: Objekt komlexní číslo

Třídy pro komplexní čísla:

class Complex:
    def __init__(self, real=0, imag=0):
        self.real = real
        self.imag = imag
 
    def amplitude(self):
        return (self.real*self.real + self.imag*self.imag)**(1/2)
 
    def add(self, rhs):
        self.real += rhs.real
        self.imag += rhs.imag
 
    def sub(self, rhs):
        self.real -= rhs.real
        self.imag -= rhs.imag
 
    def __repr__(self):
        sign = "+";
        if (self.imag < 0):
            sign = "-";
        return str(self.real) + sign + str(abs(self.imag)) + "i"
 
    def mul(self, rhs):
        r = self.real*rhs.real - self.imag*rhs.imag;
        i = self.real*rhs.imag + self.imag*rhs.real;
        self.real = r
        self.imag = i 
 
if __name__=="__main__":
    a = Complex()
    print("a=",a)
 
    b = Complex(1,-1)
    print("b=",b)
 
    a.add(b)
    print("a=",a)
 
    a.mul(b)
    print("a=",a)
 
    print("|a|=",a.amplitude())
    print("|b|=",b.amplitude())

Domácí práce: Hlavolamy

Lehká varianta:

 Robot na kluzišti

Příklad

Soubor skate1.txt obsahuje tyto data:

0 0 0 0 1 0
1 0 2 0 0 0
4 1 0 0 0 0
0 0 0 0 1 0

Výstupem programu python3 skate.py skate1.txt bude řádka:

JZS
protože nekratší cestou z (1, 2) je jet na Jih, pak na Západ a pak na Sever. Cesta robotu je naznačena písmeny S, J, a Z:
0 0 0 0 1 0       0 0 0 0 1 0       0 0 0 0 1 0
1 0 J 0 0 0       1 0 J 0 0 0       1 0 J 0 0 0
4 1 J 0 0 0       4 1 J 0 0 0       2 1 J 0 0 0
0 0 2 0 1 0       2 Z Z 0 1 0       S Z Z 0 1 0

Soubor skate2.txt obsahuje tyto data:

0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 2 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 4 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0

Výstupem programu python3 skate.py skate2.txt bude řádka:

JZJVS
Nejkratší cesta pro robota je opět označena písmeny
0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 2 0
0 0 0 0 0 1 0 0 0 0 0 J 0
0 1 Z Z Z Z Z Z Z Z Z J 0
0 0 J 0 0 0 0 0 0 0 0 1 0
0 0 J 0 0 0 0 0 1 0 0 0 0
0 1 J 0 0 0 0 0 0 1 0 0 0
0 0 J 0 0 0 1 0 0 4 0 0 0
0 0 J 0 1 0 0 0 0 S 0 0 0
0 0 J 0 0 0 0 0 0 S 0 1 0
0 1 J 0 0 0 0 0 0 S 0 0 0
0 0 J 1 0 0 0 0 0 S 0 0 0
0 1 J 0 0 0 0 0 0 S 0 0 0
0 0 J 1 0 0 0 0 0 S 0 0 0
0 0 J 0 0 0 1 0 0 S 0 0 0
0 0 J V V V V V V V 1 0 0

Soubor skate3.txt obsahuje tyto data:

1 0 0 0 0 0 0
1 0 0 0 0 0 0
0 0 0 0 1 0 0
0 0 0 0 0 2 0
0 0 0 4 1 0 0
0 0 0 1 0 0 0

Výstupem programu python3 skate.py skate3.txt bude řádka:

ZSVJ
Nejkratší cesta pro robota je opět označena písmeny
1 0 0  0  0 0 0
1 0 0  0  0 0 0
S V V  V  1 0 0
Z Z Z Z/J Z 2 0
0 0 0  4  1 0 0
0 0 0  1  0 0 0

Těžká varianta:

Příklad

Soubor horse1.txt obsahuje tyto data:

0 0 0 0 0
0 0 1 1 0
2 0 0 0 0
1 0 1 0 0
0 1 4 0 0
0 0 0 0 0

Výstupem programu python3 horse.py horse1.txt bude řádka:

0 1 2 2 3 4 4 2
protože nekratší cesta vede přes pozice (0,1), (2,2), (3,4), (4,2). Cílová pozice se uvádí, startovní se neuvádí. Cesta koně je označena písmeny H:
0 H 0  0 0
0 0 1  1 0
2 0 H  0 0
1 0 1  0 H
0 1 4H 0 0
0 0 0  0 0

Soubor horse2.txt obsahuje tyto data:

0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 1 2 0 0
0 0 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0
0 0 4 0 1 0 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0
0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0
0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0

Výstupem programu python3 horse.py horse2.txt bude řádka:

11 22 12 20 13 18 14 16 15 14 16 12 17 10 16 8 17 6 15 5 14 3 16 2
Nejkratší cesta pro robota je opět označena písmeny
0 1  0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0
0 0  0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 1  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0
0 0  1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0
0 0  0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
1 0  0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1  0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0  0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
0 0  0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0
0 0  0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0
0 0  0 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0
0 0  0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 1 0 0 0 H 0 0 1 0
0 0  0 1 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 H 0 1 1 2 0 0
0 0  1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 H 0 0 0 1 0 0 0 0
0 0  0 H 0 0 0 1 1 0 1 1 1 0 0 0 H 0 0 0 0 1 0 0 0 0 0
0 0  0 0 1 H 1 0 0 0 1 0 0 0 H 0 0 1 1 0 0 0 0 0 0 1 0
0 0 4H 0 1 0 1 1 H 0 0 1 H 0 0 0 0 1 1 0 1 0 0 0 0 0 0
0 0  0 0 1 0 H 1 0 1 H 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
0 0  0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0
0 0  0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0
0 1  0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
0 1  0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0
0 0  0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 0  0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0
0 0  0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0  0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0  0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0

Soubor horse3.txt obsahuje tyto data:

1 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 1 0 2 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 4 0 0
0 0 0 1 0 0 0 0 0 0

Výstupem programu python3 horse.py horse3.txt bude řádka:

6 4 5 6 7 7
nebo
6 4 8 5 7 7
Nejkratší cesty jsou dvě a Váš program vytiskne libovolnou jednu z nich. Níže jsou označeny obě možná řešení
1 0 0 0 0 0 0 0  0 0         1 0 0 0 0 0 0 0  0 0
0 0 0 0 1 0 0 0  0 0         0 0 0 0 1 0 0 0  0 0
0 0 0 0 0 0 1 0  0 0         0 0 0 0 0 0 1 0  0 0
0 0 0 0 0 1 0 0  0 0         0 0 0 0 0 1 0 0  0 0
0 1 0 2 0 0 0 0  0 0         0 1 0 2 0 0 0 0  0 0
0 0 0 1 0 0 H 0  0 0         0 0 0 1 0 0 0 0  0 0
0 0 0 0 H 1 0 0  0 0         0 0 0 0 H 1 0 0  0 0 
1 0 0 0 0 0 0 4H 0 0         1 0 0 0 0 0 0 4H 0 0
0 0 0 1 0 0 0 0  0 0         0 0 0 1 0 H 0 0  0 0

Soubor horse4.txt obsahuje tyto data:

0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 1 0
0 0 1 0 0 1 1 0 1 0 0 0 0 0 0
0 1 0 0 0 1 1 0 0 0 0 1 1 0 0
0 0 0 1 1 1 0 1 0 0 1 0 1 0 0
0 0 1 0 1 1 1 1 0 1 0 1 1 0 0
0 0 0 1 2 0 1 1 0 1 0 1 1 1 0
0 1 0 0 0 0 1 0 1 0 1 1 1 1 1
1 0 0 1 0 1 0 1 1 0 0 0 4 0 0
0 0 0 0 0 0 0 0 0 0 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1 1 0 0

Výstupem programu python3 horse.py horse4.txt bude řádka:

NEEXISTUJE
V tomto prostředí neexistuje cesta ze startovní pozice do cíle.