program dfsmap;
uses crt;

{Toto cudo nieje v riadku nizsie nieje nic ine ako dvojrozmerne
pole - idealna datova struktura na zapametanie si mapy
od normalneho pola sa v nicom nelisi, len v tej druhej suradnici}
var mapa:array[1..100,1..100]of integer;
    m,n,i,j,pocet:integer;
    c:char;

{Procedurka, ktorej ulohou je nacitat mapu zo vstupneho suboru}
procedure nacitaj;
var i,j:integer;
begin

{Assign - spoji program zo suborom.
informacia pre pocitac, ze sa chystame pracovat s tymto suborom }

  assign(input,'map1.txt');

{Reset - otvori subor na citanie}
  reset(input);

{A teraz pouzivame standardne prikazy read, readln, ibaze
udaje sa nevkladaju do programu z klavesnice, ale prave
z toho suboru}
  readln(n,m);

{Nacitanie mapy, do pola mapa si zapisujeme ciselnu symboliku}
  for i:=1 to n do
  begin

    for j:=1 to m do
    begin

      read(c);

      if c='#' then mapa[i,j]:=1
      else mapa[i,j]:=0;

    end;
{Po nacitani kazdeho riadku nevyhnutny prikaz - posunie nas
vo vstupnom subore na novy riadok....}
    readln;

  end;
{Ukoncenie prace so suborom - jeho uzavretie}

  close(input);

{A prikazy, ktore nam hovoria, ze budeme pouzivat na vstup
znova klavesnicu}

{V pripade, ze v prikaze assign je ako parameter '', prave to znamena
ze ideme nacitavat z klavesnice}
  assign(input,'');
{Pred tym, ako mozme so vstupom pracovat, musime ho resetovat....}
  reset(input);

end;

{Jednoducha procedurka, ktora ma nakreslit mapu...}
procedure nakresli;
var i,j:integer;
begin

{Prikaz vymazania obrazovky...}
  clrscr;

  for i:=1 to n do
  begin
    for j:=1 to m do write(mapa[i,j]);
    writeln;
  end;

{A pockame si na vstup (ktory na nastaveny na klavesnicu), aby sme
si mohli pozriet, co nam vypisalo}
  readln;

end;

{No a rekurzivna procedurka na vyfarbenei ostrova - ma
len dve ulohy: vyfarbit policko prislusnym cislom a pozret
sa na susedov.... }
procedure vyfarbi(x,y,cislo:integer);
begin

  mapa[x,y]:=cislo;

{Koment nasledujuceho riadku mozete odstranit, aby ste videli, ako presne
prebieha vyfarbovanie ostrova...}

  {nakresli;}

  if x>1 then if mapa[x-1,y]=1 then vyfarbi(x-1,y,cislo);
  if y>1 then if mapa[x,y-1]=1 then vyfarbi(x,y-1,cislo);
  if x<n then if mapa[x+1,y]=1 then vyfarbi(x+1,y,cislo);
  if y<m then if mapa[x,y+1]=1 then vyfarbi(x,y+1,cislo);

end;

begin

{Nacitanie a prve vykreslenie. Pocet znamena pocet ostrovou, alebo
aj, akym cislom sa vyfarbuje ostrov. Vsimnite si, ze pocas vyfarbovania
jedneho ostrova (pocas jedneho rekurzivneho volania procedury) sa toto
silo nemeni (parameter cislo)}
  nacitaj;
  nakresli;
  pocet:=0;


{Tieto dva forcykly nam prechadzaju celu mapu a hladaju nove ostrovy.
Ked najdu cislo jeden, tak sa vyfarbi cely ostrov a mapa nakresli, aby
sme videli vysledok. Samozrejme ze sa musi zvysit aj pocet}

  for i:=1 to n do
  begin

    for j:=1 to m do if mapa[i,j]=1 then
    begin
      pocet:=pocet+1;
      vyfarbi(i,j,pocet+1);
      nakresli;
    end;

  end;


end.
