Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Flood Fill  (Citit de 8220 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Anamaria20
Strain


Karma: 6
Deconectat Deconectat

Mesaje: 20



Vezi Profilul
« : Ianuarie 29, 2010, 17:51:17 »

  Smile Unde pot gasi un articol bun despre Flood Fill, si eventual si o sursa in care este aplicat? De pe Wikipedia nu am inteles mare lucru si vreau sa invat algoritmul... Tot legat de el, sunt sanse sa se ceara la clasa a 9-a? Multumesc anticipat.
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #1 : Ianuarie 29, 2010, 17:56:02 »

Ma indoiesc ca va aparea ceva de genu la clasa a 9 dar nu strica sa sti.
In primul rand sti functii ( recursive ) ?
Memorat
Anamaria20
Strain


Karma: 6
Deconectat Deconectat

Mesaje: 20



Vezi Profilul
« Răspunde #2 : Ianuarie 29, 2010, 17:57:07 »

Da, pot sa zic ca ma descurc. Implica asa ceva?
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #3 : Ianuarie 29, 2010, 18:18:07 »

Da, pot sa zic ca ma descurc. Implica asa ceva?
Da.
 Hai sa analizam urmatoarea problema. Se da o matrice binara de n X m. Se cere sa se determine numarul de grupuri de 1.
Dintr-o casuta se poate deplasa pe toate cele 8 directii.
Ex:
input.txt
5 6
0 1 1 0 0 0
0 1 1 1 0 0
1 0 0 0 0 1
0 0 1 1 1 0
1 0 0 0 0 1
output.txt
3
Acum din casuta de coordonate ( x, y ) se poate ajunge in : ( x-1, y-1 ), ( x-1, y ), (x-1, y ), ( x, y-1 ), ( x, y+1 ), ( x+1, y-1) , ( x+1, y ), (x+1, y+1 ).
Cod:
#include <fstream>
#define Nmax 100

/*
 *
 */
using namespace std;
const int dx[]={ -1, -1, -1, 0, 0, 1, 1, 1 }, dy[]={ -1, 0, 1, -1, 1, -1, 0, 1 };
bool M[Nmax][Nmax]; //memorez matricea.
int N, M;
void fill( int x, int y )
{int xnou, ynou, i;
       for(  i=0; i < 8; ++i )
      {
              xnou=x+dx[i];
              ynou=y+dy[i];
              if( xnou < 0 || ynou < 0 || xnou >= N || ynou >= N || !M[xnou][ynou] ) /*daca coordonatele sunt invalide sau M[xnou][ynou] este 0 */
                continue;  //merg mai departe
              M[xnou][ynou]=0; //marche ca am fost pe aici
              fill( xnou, ynou ); //si apelez functia pentru a vedea unde pot ajunge din noul patratel
      }
}
int main()
{
        int n, m, i, j, nr=0;
        ifstream in("input.txt");
        in>>n>>m;
        for( i=0; i < n; ++i )
            for( j=0; j < m; ++j )
                 in>>M[i][j];
        for( i=0; i < n; ++i )
            for( j=0; j < m; ++j )
                if( 1 == M[i][j] ) //am dat peste un grup
               {
                     ++nr; //numar
                      fill( i, j ); //si acum sa identific si restul elementelor din grup ca sa le marchez cu 0
                }
        ofstream out("output.txt");
        out<<nr;
        return 0;
}           
Memorat
Anamaria20
Strain


Karma: 6
Deconectat Deconectat

Mesaje: 20



Vezi Profilul
« Răspunde #4 : Ianuarie 29, 2010, 18:22:37 »

Multumesc mult. Very Happy Am inteles care e ideea. Ma apuc de probleme cu el.
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #5 : Ianuarie 30, 2010, 09:32:47 »

Multumesc mult. Very Happy Am inteles care e ideea. Ma apuc de probleme cu el.
Nu creda ca o sa poti rezolva prea multe probleme ( pe infoarena cel putin ) Smile. Fill  fiind recursiv mananca multa memorie din stiva si consuma foarte mult timp pentru gestionarea stivei.
Eu iti recomand sa folosesti Algoritmul lui Lee. Algoritmul lui Lee foloseste o coada( un vector in care inserarea unui element se face la sfarsit si se extrage un elemente de la inceput ) pentru a stoca coordonatele.
Il poti folosi si pentru determinarea drumului minim dintre 2 puncte...
Cod:
#include <fstream>
#define Nmax 100

/*
 *
 */
using namespace std;
const int dx[]={ -1, -1, -1, 0, 0, 1, 1, 1 }, dy[]={ -1, 0, 1, -1, 1, -1, 0, 1 };
bool M[Nmax][Nmax]; //memorez matricea.
int N, M;
int C[Nmax*Nmax][2]; //daca stii liste simplu inlantuite ii si mai eficient :)
void lee( int x, int y )
{
       int p, u, i, xnou, ynou;
       C[0][0]=x;  C[0][1]=y;
       for( p=0, u=0;  p <= u; ++p )
      {
              x=C[p][0];
              y=C[p][1];
              for(   i=0; i < 8; ++i )
              {
                      xnou=x+dx[i];
                      ynou=y+dy[i];
                      if( xnou < 0 || ynou < 0 || xnou >= N || ynou >= N || !M[xnou][ynou] )
                           continue;
                     M[xnou][ynou]=0;
                     C[++u][0]=xnou;
                     C[u][1]=ynou;
             }
       }
}
int main()
{
        int n, m, i, j, nr=0;
        ifstream in("input.txt");
        in>>n>>m;
        for( i=0; i < n; ++i )
            for( j=0; j < m; ++j )
                 in>>M[i][j];
        for( i=0; i < n; ++i )
            for( j=0; j < m; ++j )
                if( 1 == M[i][j] ) //am dat peste un grup
               {
                     ++nr; //numar
                      lee( i, j ); //si acum sa identific si restul elementelor din grup ca sa le marchez cu 0
                }
        ofstream out("output.txt");
        out<<nr;
        return 0;
}  
Memorat
Anamaria20
Strain


Karma: 6
Deconectat Deconectat

Mesaje: 20



Vezi Profilul
« Răspunde #6 : Ianuarie 30, 2010, 09:43:42 »

 Embarassed Eu intrebam de Flood Fill pentru ca am gasit o problema in care trebuia aflat numarul de incaperi dintr-o cladire. De Lee stiam, dar chiar nu m-am gandit sa-l folosesc aici. Il foloseam numai in probleme cu drum minim dintre doua puncte. Acum cred ca m-am lamurit.  Very Happy
Memorat
chera_lary
De-al casei
***

Karma: -2
Deconectat Deconectat

Mesaje: 106



Vezi Profilul
« Răspunde #7 : Ianuarie 31, 2010, 18:07:01 »

Practic daca transofrmi algoritmul de Fill din forma recursiva in forma iterativa se ajunge la forma algoritmului lui Lee. Very Happy
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #8 : Februarie 20, 2010, 10:16:28 »

Uite aceasta problema, e de clasa a 10-a, dar poti face doar punctul A), numarul de insule se afla cu algoritmul Flood Fill. A doua parte o faci cu algoritmul lui Lee. Pentru algoritmul lui Lee ai aici o problema.
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #9 : Februarie 20, 2010, 13:35:16 »

Uite aceasta problema, e de clasa a 10-a, dar poti face doar punctul A), numarul de insule se afla cu algoritmul Flood Fill. A doua parte o faci cu algoritmul lui Lee. Pentru algoritmul lui Lee ai aici o problema.
Ambele se fac cu lee Tongue
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #10 : Februarie 20, 2010, 13:44:00 »

Bine, istetule, FLOOD FILL este totuna cu algoritmul lui Lee. Deci ori zic Flood-Fill, ori zic Lee, e totuna.
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #11 : Februarie 20, 2010, 13:55:58 »

Bine, istetule, FLOOD FILL este totuna cu algoritmul lui Lee. Deci ori zic Flood-Fill, ori zic Lee, e totuna.
Ambele fac aceeasi chestie, una e recursiv, alta e iterativ Smile
Memorat
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #12 : Februarie 20, 2010, 13:56:58 »

Usor, nu deveniti temperamentali. Tongue

Dupa parerea mea, cel mai bine este sa stapaniti algoritmul BFS, restul sunt aplicatii in cazuri particulare.
Memorat

Am zis Mr. Green
blasterz
Nu mai tace
*****

Karma: 92
Deconectat Deconectat

Mesaje: 255



Vezi Profilul
« Răspunde #13 : Februarie 20, 2010, 17:38:29 »

Bine, istetule, FLOOD FILL este totuna cu algoritmul lui Lee. Deci ori zic Flood-Fill, ori zic Lee, e totuna.
Ambele fac aceeasi chestie, una e recursiv, alta e iterativ Smile


Flood Fill nu este Lee!
Lee e defapt BFS si acesta determină drumuri cu nr minim de muchii.
Flood Fill poate fi implementat atât cu BFS cât si cu DFS.
DFS nu determină drumuri cu nr minim de muchi! ! !
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #14 : Februarie 20, 2010, 17:41:31 »

Nici n-am zis ca sunt aceeasi chestie, am zis ca fac acelasi lucru Smile
Memorat
blasterz
Nu mai tace
*****

Karma: 92
Deconectat Deconectat

Mesaje: 255



Vezi Profilul
« Răspunde #15 : Februarie 20, 2010, 18:47:44 »

Nici n-am zis ca sunt aceeasi chestie, am zis ca fac acelasi lucru Smile

Ziceam mai mult pentru Robert..
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines