2. Mřížky / Záplavové vyplňování

Podobné dokumenty
BI-EP2 Efektivní programování 2

BI-EP1 Efektivní programování 1

Základní datové struktury

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

6. Tahy / Kostry / Nejkratší cesty

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Úvod do teorie grafů

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

Datové struktury 1: Základní datové struktury

Vzdálenost uzlů v neorientovaném grafu

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Algoritmus pro hledání nejkratší cesty orientovaným grafem

5 Algoritmy vyplňování 2D oblastí

Šablony, kontejnery a iterátory

PROHLEDÁVÁNÍ GRAFŮ. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Matice sousednosti NG

Abstraktní datové typy

Datové struktury. alg12 1

Šablony, kontejnery a iterátory

Rekurzivní algoritmy

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

Algoritmizace prostorových úloh

bfs, dfs, fronta, zásobník, prioritní fronta, halda

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Dynamické datové struktury III.

Lineární datové struktury

Algoritmy na ohodnoceném grafu

TGH05 - aplikace DFS, průchod do šířky

Hledáme efektivní řešení úloh na grafu

5. Dynamické programování

Abstraktní datové typy: zásobník

5 Rekurze a zásobník. Rekurzivní volání metody

Základní datové struktury III: Stromy, haldy

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

TGH05 - aplikace DFS, průchod do šířky

Stromy, haldy, prioritní fronty

Algoritmizace prostorových úloh

Graf. Uzly Lokality, servery Osoby fyzické i právní Informatické objekty... atd. Hrany Cesty, propojení Vztahy Informatické závislosti... atd.

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

Algoritmus pro generování normálních magických čtverců

Jana Dannhoferová Ústav informatiky, PEF MZLU

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Lineární datové struktury

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Booklet soutěže družstev

6. Základy výpočetní geometrie

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

bfs, dfs, fronta, zásobník

Algoritmizace prostorových úloh

Algoritmy a datové struktury

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Dynamické datové struktury IV.

Dynamické datové struktury I.

PROGRAMOVÁNÍ. Cílem předmětu Programování je seznámit posluchače se způsoby, jak algoritmizovat základní programátorské techniky.

Text úlohy. Která barva nepatří do základních barev prostoru RGB? Vyberte jednu z nabízených možností: a. Černá b. Červená c. Modrá d.

Pole, množina, tabulka

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Základy programování (IZP)

Konstruktory a destruktory

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Paralelní grafové algoritmy

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

Kolekce, cyklus foreach

1. Úvodní informace. BI-EP1 Efektivní programování Martin Kačer

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Programování v C++ 2, 4. cvičení

Spojová implementace lineárních datových struktur

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Binární vyhledávací stromy II

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

68. ročník Matematické olympiády 2018/2019

Zadání semestrálního projektu Algoritmy I. zimní semestr 2018/2019

IUJCE 07/08 Přednáška č. 6

07 Základní pojmy teorie grafů

Metody návrhu algoritmů, příklady. IB111 Programování a algoritmizace

Jan Březina. Technical University of Liberec. 30. dubna 2013

Prohledávání do šířky = algoritmus vlny

Použití dalších heuristik

prohled av an ı graf u Karel Hor ak, Petr Ryˇsav y 16. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Základy informatiky. 07 Teorie grafů. Kačmařík/Szturcová/Děrgel/Rapant

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Dynamické programování

Časová a prostorová složitost algoritmů

Dynamické programování

Úvod do programování - Java. Cvičení č.4

Generické programování

Jan Březina. Technical University of Liberec. 21. dubna 2015

KTE / ZPE Informační technologie

Transkript:

2. Mřížky / Záplavové vyplňování BI-EP2 Efektivní programování 2 LS 2017/2018 Ing. Martin Kačer, Ph.D. 2011-18 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze Vznik předmětu byl podpořen FRVŠ v rámci projektu 2581/2011

Mřížky Pravidelná struktura Anglický název Grid Lattice Raster Mesh Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 2

Význam mřížek Pravidelné rozdělení prostoru Modelování a reprezentace Části mřížky Uzly Hrany Vnitřky (Plochy, Stěny) Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 3

Pravoúhlé mřížky Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 4

Pravoúhlé mřížky uzly hrany plochy okraje Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 5

Pravoúhlé mřížky reprezentace Reprezentace pomocí matice (2D pole) Přímočará Snadná 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 6

Pravoúhlé mřížky data Co do matice ukládat? Záleží na úloze Příklad: Stav políčka plné/prázdné 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 7

Pravoúhlé mřížky Co do matice ukládat? Záleží na úloze Příklad: Barva nebo odstín 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 8

Příklady úloh s mřížkou Maximální prázdný/plný obdélník Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 9

Příklady úloh s mřížkou Detekce souvislých oblastí Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 10

Příklady úloh s mřížkou Detekce souvislých oblastí Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 11

Příklady úloh s mřížkou Průchod bludištěm Různě komplikovaný (klíče atp.) exit Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 12

Příklady úloh s mřížkou Vyplnění obrysu X Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 13

Příklady úloh s mřížkou Vyplnění obrysu Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 14

Operace s mřížkou Přístup k danému poli Zjištění sousedních polí Rozpoznání okrajů Projití celé oblasti (iterace) Různé pořadí (po řádcích, diagonálně atp.) Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 15

Operace pravoúhlé mřížky Sousední pole jsou jednoduchá i-1, j i, j-1 i, j i, j+1 i+1, j Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 16

j == 0 j == COLS-1 Operace pravoúhlé mřížky Okraje záleží na tvaru V případě obdélníku (čtverce) opět snadné i == 0 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 2,0 2,1 2,2 i, j 2,4 2,5 2,6 2,7 3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 i == ROWS-1 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 17

Iterace pravoúhlé mřížky Po řádcích (row-major) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 for (int i = 0; i < ROWS; ++i) for (int j = 0; j < COLS; ++j) { do_something(i, j); } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 18

Iterace pravoúhlé mřížky Po sloupcích (column-major) 1 5 9 13 17 2 6 10 14 18 3 7 11 15 19 4 8 12 16 20 for (int j = 0; j < COLS; ++j) for (int i = 0; i < ROWS; ++i) { do_something(i, j); } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 19

Iterace pravoúhlé mřížky Hadovitě (snake-like) 1 2 3 4 5 10 9 8 7 6 11 12 13 14 15 20 19 18 17 16 for (int i = 0; i < ROWS; i += 2) { for (int j = 0; j < COLS; ++j) { do_something(i, j); } if (i+1 < ROWS) for (int j = COLS; --j >= 0; ) { do_something(i+1, j); } } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 20

Iterace pravoúhlé mřížky Hadovitě (snake-like) Jiná možnost 1 2 3 4 5 10 9 8 7 6 11 12 13 14 15 20 19 18 17 16 for (int i = 0; i < ROWS; ++i) for (int j = 0; j < COLS; ++j) { do_something(i, j + (COLS-1-2*j) * (i%2)); } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 21

Iterace pravoúhlé mřížky Diagonálně (diagonal) 1 2 4 7 11 3 5 8 12 15 6 9 13 16 18 10 14 17 19 20???? Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 22

Zarážky na okraji Může se vyplatit přidat na kraj pole navíc Zjednodušuje podmínky 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 23

Zarážky na okraji Může se vyplatit přidat na kraj pole navíc 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 2,9 3,0 3,1 3,2 3,3 3,4 3,5 3,6 3,7 3,8 3,9 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 4,8 4,9 5,0 5,1 5,2 5,3 5,4 5,5 5,6 5,7 5,8 5,9 6,0 6,1 6,2 6,3 6,4 6,5 6,6 6,7 6,8 6,9 7,0 7,1 7,2 7,3 7,4 7,5 7,6 7,7 7,8 7,9 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 24

Méně pravidelné mřížky Cokoli, co není pravidelný obdélník Chybějící políčka Nepravidelná struktura Nepravoúhlá povaha Potřeba najít vhodné indexování Viz operace: sousedé, okraje, iterace Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 25

Šachovnice Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 26

Šachovnice varianta 1 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 2,0 2,1 2,2 2,3 3,0 3,1 3,2 3,3 4,0 4,1 4,2 4,3 5,0 5,1 5,2 5,3 Okraje dobře definované Iterace také poměrně jednoduchá jen pozor při lichém počtu sloupců! Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 27

Šachovnice varianta 1 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 2,0 2,1 2,2 2,3 3,0 3,1 3,2 3,3 4,0 4,1 4,2 4,3 5,0 5,1 5,2 5,3 i-1,? i+1,? i, j i-1,? i+1,? Ale netriviální zjištění sousedů! Rozdíl: lichý x sudý řádek Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 28

Šachovnice varianta 2 0,0 0,2 0,4 0,6 1,1 1,3 1,5 1,7 2,0 2,2 2,4 2,6 3,1 3,3 3,5 3,7 4,0 4,2 4,4 4,6 x y 5,1 5,3 5,5 5,7 Iterace i okraje stále dobré Dokonce i sousedé Ale pozor plýtváme pamětí! i-1, j-1 i+1, j-1 i, j i-1, j+1 i+1, j+1 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 29

Šachovnice varianta 3 y 0,0 1,1 2,2 3,3 1,0 2,1 3,2 4,3 1,-1 2,0 3,1 4,2 2,-1 3,0 4,1 5,2 2,-2 3,-1 4,0 5,1 3,-2 4,-1 5,0 6,1 Sousedé ok x Složitější okraje a iterace A navíc záporné indexy i-1, j i, j-1 i, j i, j+1 i+1, j Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 30

x y Šachovnice varianta 4 0,0 1,2 2,4 3,6 1,1 2,3 3,5 4,7 1,0 2,2 3,4 4,6 2,1 3,3 4,5 5,7 2,0 3,2 4,4 5,6 3,1 4,3 5,5 6,7 Sousedé ok Složitější okraje a iterace a už zase plýtváme i-1, j-1 i, j-1 i, j i, j+1 i+1, j+1 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 31

Šachovnice varianta 5 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23?? i?? Vlastní mapovací funkce Iterace ok Složitější okraje a sousedé Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 32

Hrany mezi čtverečky Zajímají nás hrany, nikoli políčka Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 33

Hrany mezi čtverečky Trochu podobné jako šachovnice Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 34

Hrany mezi čtverečky 0,0 0,1 0,2 0,3 0,4 0,5 0,0 0,1 0,2 0,3 0,4 0,5 0,6 1,0 1,1 1,2 1,3 1,4 1,5 1,0 1,1 1,2 1,3 1,4 1,5 1,6 2,0 2,1 2,2 2,3 2,4 2,5 2,0 2,1 2,2 2,3 2,4 2,5 2,6 3,0 3,1 3,2 3,3 3,4 3,5 3,0 3,1 3,2 3,3 3,4 3,5 3,6 4,0 4,1 4,2 4,3 4,4 4,5 Lépe 2 matice: vodorovné [R+1][C] svislé [R][C+1] Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 35

Trojúhelníkové mřížky 0,0 1,0 1,1 i-1, j-1 i-1, j 2,0 2,1 2,2 i, j-1 i, j i, j+1 3,0 3,1 4,0 4,1 4,2 3,2 4,3 3,3 4,4 i+1, j i+1, j+1 5,0 5,1 5,2 5,3 5,4 5,5 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 36

Trojúhelníkové mřížky 1,-1 0,0 1,0 1,1 i, j-1 i-1, j i, j i, j+1 3,-3 2,-2 3,-2 2,-1 3,-1 2,0 3,0 2,1 3,1 2,2 3,2 3,3 i, j-1 i, j+1 i, j i+1, j Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 37

Šestiúhelníkové mřížky Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 38

Šestiúhelníkové mřížky -3,-1-3,1-2,-2-1,-1-2,0-1,1-2,2 i-2, j 0,-2 2,-2 1,-1 0,0 2,0 1,1 0,2 2,2 y i-1, j-1 i, j i-1, j+1 3,-1 3,1 i+1, j-1 i+1, j+1 4,-2 5,-1 4,0 5,1 4,2 i+2, j 6,-2 6,0 6,2 x Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 39

Šestiúhelníkové mřížky -1,-2 0,-2 1,-2 2,-2 3,-2-1,-1 0,-1 1,-1 2,-1 3,-1-2,0-1,0 0,0 1,0 2,0 x -2,1-1,1 0,1 1,1 2,1-3,2-2,2-1,2 0,2 1,2 y i, j-1 i+1, j-1 i-1, j i, j i+1, j i-1, j+1 i, j+1 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 40

Dualita mřížek Duální mřížka Z ploch udělám uzly Z původních uzlů se stanou nové plochy Hrany se otočí o 90 (velmi obrazně řečeno) Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 41

Dualita mřížek Pravoúhlá Pravoúhlá Trojúhelníková Šestiúhelníková Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 42

Vícerozměrné mřížky 3-D Trojrozměrné pole n-d Vlastní mapovací funkce Povrch tělesa Pravidelné n-stěny Kopací míč Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 43

Pravidelná tělesa Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 44

Povrch fotbalového míče Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 45

Příklady z úvodu Maximální prázdný/plný obdélník Dynamické programování (viz EP1) Detekce souvislých oblastí Spočítání oblastí ( skvrn ) Vyplnění oblasti Průchod bludištěm a další za chvíli Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 46

Nebojte se datových struktur Časová a paměťová složitost Podmínky & další omezení případně další Vlastnosti implementace Signatura (ADT) function Vlož_prvek(table, x) { Hash h = spočítej_hash(x); if (existuje(h)) { h = další_hash(h, x); } tabulka_vlož(h, x); } Pseudokód public V put(k key, V value){ int h = hash(key);... if (tab[i =(n-1)&hash]) tab[i] =...; else { if (p.hash == hash && (p.key == key key=k)) e = p;... } return oldvalue } Kód Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 47

5 7 3 4 Init Push Pop Is Empty Příklad: Zásobník int stack[max], top; top = 0; stack[top++] = x; return stack[--top]; return!top; Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 48

3 7 5 4 Příklad: Fronta int q[max], qh, qt; Init Enqueue Dequeue Is Empty qh = qt = 0; q[qt++ % MAX] = x; return q[qh++ % MAX]; return qh == qt; Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 49

Flood Fill (Seed Fill) Semínkové / záplavové vyplňování Souvislá oblast mřížky od zadaného pole X Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 50

Flood Fill (Seed Fill) Semínkové / záplavové vyplňování Souvislá oblast mřížky od zadaného pole X Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 51

Flood Fill Princip algoritmu 1. Vyplníme zadané políčko 2. Přesuneme se na jeho volné sousedy Sousedů může být více než jeden Nelze je zpracovat najednou Musíme postupně (jedním začít a pamatovat si ostatní) Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 52

Flood Fill sousední políčka Pamatovat si ostatní a vrátit se k nim Postupně pomocí rekurze Uložení do datové struktury Fronta Zásobník Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 53

Flood Fill kostra algoritmu (psáno částečně pseudokódem) void flood_fill(int x, int y) { if (!volné_pole(x,y)) return; zaplň_pole(x,y); for (sx,sy: sousední_pole(x,y)) { flood_fill(sx, sy); } } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 54

Flood Fill jednoduchý případ (nyní již reálný kód) void flood_fill(int x, int y) { if (full[x][y]) return; full[x][y] = 1; Pořadí!! flood_fill(x, y-1); flood_fill(x, y+1); flood_fill(x-1, y); flood_fill(x+1, y); } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 55

Flood Fill drobné rozšíření Spočítat, kolik políček vyplním int flood_fill(int x, int y) { if (full[x][y]) return 0; full[x][y] = 1; return 1 + flood_fill(x, y-1) + flood_fill(x, y+1) + flood_fill(x-1, y) + flood_fill(x+1, y); } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 56

Flood Fill s frontou Pozor na vhodnou velikost fronty (pole) Maximálně počet všech políček v mřížce int[] qx, qy; int qb, qe; void enqueue(int x, int y) { if (!full[x][y]) { full[x][y] = 1; qx[qe] = x; qy[qe++] = y; } } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 57

Flood Fill s frontou void flood_fill(int x, int y) { qb = qe = 0; enqueue(x, y); while (qb < qe) { x = qx[qb]; y = qy[qb++]; enqueue(x, y-1); enqueue(x, y+1); enqueue(x-1, y); enqueue(x+1, y); } } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 58

Flood Fill pořadí vyplňování Rekurze nebo zásobník (DFS) Preference dle pořadí sousedů Relativně nevyzpytatelné Fronta (BFS) Dle vzdálenosti od počátku Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 59

Flood Fill se vzdáleností void flood_fill(int x, int y) { qb = qe = 0; enqueue(x, y, 0); while (qb < qe) { x = qx[qb]; y = qy[qb++]; enqueue(x, y-1, dist[x][y]); enqueue(x, y+1, dist[x][y]); enqueue(x-1, y, dist[x][y]); enqueue(x+1, y, dist[x][y]); } } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 60

Flood Fill se vzdáleností int[] qx, qy; int qb, qe; void enqueue(int x, int y, int d) { if (!dist[x][y]) { dist[x][y] = d+1; qx[qe] = x; qy[qe++] = y; } } Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 61

Vzdálenost příklad Fialová pole jsou nedostupná ( zeď ) 8 7 6 5 4 12 13 3 11 12 10 2 1 2 10 9 3 9 10 8 4 5 6 7 8 9 7 6 5 6 7 8 9 10 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 62

Příklady z úvodu Vyplnění oblasti Flood-Fill BFS nebo DFS (jen pozor na zásobník) Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 63

Příklady z úvodu Detekce souvislých oblastí Flood-Fill BFS nebo DFS (jen pozor na zásobník) Spočítání oblastí ( skvrn ) Projdu všechna políčka, pro obsazená zavolám Flood-Fill ( vymazání ) Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 64

Příklady z úvodu Průchod bludištěm BFS Najdu rovnou nejkratší cestu 8 7 6 5 4 12 13 3 11 12 10 2 1 2 10 9 3 9 10 8 4 5 6 7 8 9 7 6 5 6 7 8 9 10 Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 65

Úlohy Mřížky Hexagonal Routes Triangular Vertices Záplavové vyplňování Jeskyně Die Is Cast Martin Kačer, BI-EP2 2. Mřížky & Záplavové vyplňování 66