====== Cvičení 5: 2D pole ======
===== náplň cvičení =====
==== Úkol 1-2 Opakování ====
* Nedokončený příklad z minulého cvičení
==== Dvourozměrné pole ====
* Načtení matice - dvourozměrného pole - ze souboru kombinuje načítání vektoru z minulého cvičení
pole=[]
f=open('pole.txt','r')
for line in f:
pole.append(list(map(int, line.split())))
==== Matice ====
* 2D pole se hodí např. pro reprezentaci matic
==== Úkol 3 Výpis matice ====
* Napište funkci ''printMatrix'', která vypíše matici zadanou 2D polem
* Prvky budou odděleny mezerou a každý řádek bude vypsán na nový řádek
* Kromě prvků matice nebude vypsán žádný jiný znak
==== Úkol 4 Násobení vektoru a matice ====
* Napište funkci ''multiVecMat(v,m)'', která vypočte součin vektoru $v$ a matice $m$.
* Pokud nesouhlasí rozměry matice a vektoru, pak funkce vrací ''None''.
* Vypočtete výsledek násobení $v \cdot m$:
m=[[0,0,1],[0,1,0],[1,0,0]]
v=[2, 4, 6]
===== Témata k procvičení =====
Implementujte následující úlohy:
* Funkce, která v matici najde všechny záporné hodnoty, vraťte seznam jejich indexů
* Funkce pro násobení dvou matic
* Funkce pro výpočet determinantu matice
* Funkce pro výpočet [[ https://en.wikipedia.org/wiki/Trace_(linear_algebra) | stopy ]] matice
===== Domácí úkol =====
==== Lehká varianta ====
* Napište program **play.py**, který načte soubor zadaný jako první argument {{courses:b3b33alp:cviceni:piskvorka.txt|sys.argv[1]}} a zjistí, kam musí táhnout křížek (1), aby vyhrál, tedy aby vytvořil piškvorku.
* Soubor obsahuje matici celých čísel n x n - celých čísel, n zjistíte podle délky a počtu řádek souboru.
* Význam čísel:
* 0 - volné pole
* 1 - křížek
* 2 - kolečko
* Program vytiskne na standardní výstup indexy řádku a sloupce volného políčka matice, kam když zahraje hráč křížek (1), tak vyhraje.
* Program v souboru **play.py** odevzdejte pomocí odevzdávacího systému (úloha HW05).
* Můžete předpokládat, že všechny matice jsou zadány korektně, tedy všechny řádky mají stejný počet prvků, který se rovná počtu řádků souboru.
=== Příklad ===
Vstup:
0 2 0 0 0 0 2 2 1 0
0 0 2 2 1 2 1 2 1 1
1 2 2 0 1 1 1 2 0 2
2 2 0 2 0 2 2 2 2 0
0 0 0 0 1 2 2 0 0 1
1 1 1 0 2 1 1 2 1 2
1 2 1 1 1 2 2 1 1 1
2 1 0 2 2 0 2 2 1 1
0 2 1 2 2 2 0 0 2 0
0 0 1 0 1 2 2 1 0 1
Výstup:
7 2
Vysvětlení: Místo pro vytvoření piškvorky je označeno ''X''
0 2 0 0 0 0 2 2 1 0
0 0 2 2 1 2 1 2 1 1
1 2 2 0 1 1 1 2 0 2
2 2 0 2 0 2 2 2 2 0
0 0 0 0 1 2 2 0 0 1
1 1 1 0 2 1 1 2 1 2
1 2 1 1 1 2 2 1 1 1
2 1 X 2 2 0 2 2 1 1
0 2 1 2 2 2 0 0 2 0
0 0 1 0 1 2 2 1 0 1
==== Těžká varianta ====
* Napište program **chess.py**, který načte soubor zadaný na příkazové řádce (''argv[1]''). Tento soubor kóduje stav šachovnice před tahem bílého. Program najde tah pro bílého, aby dal černému šach.
* **Vstup**
* Stav šachovnice je zaznamenán čísly reprezentující jednotlivé figury podle následující tabulky (bíle figury mají kladnou hodnotu, černé zápornou):
^ figura ^ bílý ^ černý ^
| král | 1 | -1 |
| dáma | 2 | -2 |
| věž | 3 | -3 |
| střelec | 4 | -4 |
| jezdec | 5 | -5 |
| pěšec | 6 | -6 |
| volné pole | 0 | 0 |
* **Výstup (standardní výstup)**
* Výstupem Vašeho programu jsou čtyři čísla oddělená mezerou zaznamenávající souřadnice:
* řádek sloupec kde tah začíná
* řádek sloupec kde tah končí
* řádky a sloupce se číslují od 0 do 7
* poloha 0 0 je levý horní roh šachovnice, šachisty označovaný jako a8
* Soubor (viz. příklad {{courses:b3b33alp:cviceni:chess.txt|chess.txt}}) obsahuje dvourozměrné pole, ve kterém jsou výše definované hodnoty (soubor nebývá zarovnán tak, jak je to níže v textu; použití split() ale dává stejné výsledky)
* Protože neznáme historii tahů neuvažujte tzv. [[https://cs.wikipedia.org/wiki/Bran%C3%AD_mimochodem|braní mimochodem]].
* Také nemusíte uvažovat výměnu pěšce na posledním políčku šachovnice za jinou figuru, protože pěšci nejsou umístěni v dosahu posledního řádku šachovnice.
* Program v souboru **chess.py** odevzdejte pomocí odevzdávacího systému (úloha HW05).
----
Vstup obsah souboru, zadaného jako vstupní argument:
0 0 0 0 0 0 0 0
-6 0 -6 0 0 0 0 0
0 0 0 0 -6 -6 -6 -3
0 0 0 -6 0 -5 4 0
0 0 0 5 6 0 -4 6
6 0 -5 4 0 6 0 0
0 6 6 0 0 0 0 0
1 0 0 5 -1 0 0 0
Výstup:
3 6 6 3
tedy tah střelec (4) z pole g4 na d2