Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wyszukiwanie połączeń w tablicy dwuwymiarowej

Ostatnio zmodyfikowano 2015-12-02 11:16
Autor Wiadomość
Orzhov
Temat założony przez niniejszego użytkownika
Wyszukiwanie połączeń w tablicy dwuwymiarowej
» 2015-11-30 20:12:45
Witam serdecznie,
Pracuję nad programem, którego zadaniem jest zliczenie połączeń w tablicy dwuwymiarowej (takich samych znaków, w liniach prostych)
Dla przykładu chcąc policzyć Y w takiej tablicy:

X Y Y Y X
Y X Y X X
Y X X X X
X X X Y Y
X X X Y X

Mamy 3 połączone grupy Y, 4 elementową, 3 elementową i 2 elementową

A dla takiej

X X Y
Y X X
X Y X

Jedynie 3 grupy po 1 element.
Tablica jest wypełniona jedynie 2 rodzajami znaków (puste / pełne).

Utknąłem niestety odrobinę w martwym punkcie, stąd temat na forum z nadzieją że ktoś mnie naprowadzi na rozwiązanie.
Chwilowo mam wprowadzenie danych do tablicy wielowymiarowej i algorytm ( nie napisany przeze mnie, gotowy) wyszukiwania Weighted Quick-Union with Path Compression.

Całość kodu wygląda tak:
C/C++
#include <iostream>
#include <vector>
#include <sstream>
#include <string>

using namespace std;

int x, y;
int rozmiar;
int cc;
int N;
vector < int > id;
vector < int > rk;

void init( int size )
{
    cc = size;
    N = size;
   
    id.resize( size );
    rk.resize( size );
   
    for( int i = 0; i < N; i++ )
    {
        id[ i ] = i;
        rk[ i ] = 0;
    }
}

int find( int p )
{
    while( p != id[ p ] )
    {
        id[ p ] = id[ id[ p ] ];
        p = id[ p ];
    }
    return p;
}

bool connected( int p, int q )
{
    return find( p ) == find( q );
}

void make_union( int p, int q )
{
    int rootp = find( p );
    int rootq = find( q );
    if( rootp == rootq ) return;
   
   
    if( rk[ rootp ] < rk[ rootq ] )
    {
        id[ rootp ] = rootq;
    }
    else if( rk[ rootp ] > rk[ rootq ] )
    {
        id[ rootq ] = rootp;
    }
    else
    {
        id[ rootq ] = rootp;
        rk[ rootp ] ++;
    }
    cc--;
}


int main( int argc, char * argv[] )
{
    int mapanieba[ rozmiar ][ rozmiar ];
    cout << "Rozmiar";
    cin >> rozmiar;
    for( x = 0; x < rozmiar; x++ )
    {
        for( y = 0; y < rozmiar; y++ )
        {
            cin >> mapanieba[ x ][ y ];
        }
    }
    // read number of elements
    int N = rozmiar * rozmiar;
    init( N );

Oczywiście jest niedokończony, a ja nie umiem wpaść na to, co należy zrobić dalej, żeby móc "przepuścić" elementy tablicy przez algorytm i uzyskać liczbę połączeń. Znajdzie się ktoś kto poda pomocną dłoń i naprowadzi?
P-141193
darko202
» 2015-12-01 08:01:30
1.
za bardzo kombinujesz,
sam algorytm nie jest przecież strasznie trudny 
idziesz po tablicy i sprawdzasz czy następna komórka ((według przyjętego kryterium - linia prosta) ma tą samą wartość np.
tab[i,j] == tab [i+1,j]


2.
nie wiem jaki algorytm wykorzystałeś, ale to co zaprezentowałeś to działanie po jednym wymiarze i nie za bardzo widzę związek z Twoim zadaniem.

zapomnij o nim i zacznij od nowa

a. tworzysz tablicę
b. wypełniasz ją
c. sprawdzenie
   tab[i,j] == tab [i+1,j]
d. może też sprawdzenie
   tab[i,j] == tab [i,j+1]



Powodzenia :)
P-141221
Szadziu
» 2015-12-01 13:35:28
Leć po kolei po każdym elemencie tablicy. Jeśli znajdziesz Y to dodaj stwórz jakiś element mówiący ci o połączeniu, ustaw mu wartość na 1. Zamień ten elemeny na jakiś inny np. Z. Następnie sprawdź jego otoczenie ( 8 elementów ) czy któryś jest Y. Jeśli tak zrób to samo co dla tego elementu. Powtarzaj aż ilość będzie 0. Następnie sprawdzaj kolejne elementy tablicy.
P-141226
ArgonZapan
» 2015-12-01 20:11:02
@darko202 - twój algorytm wykaże 5 połączeń dla 1 przykładu

@Szadziu - Tu się zgodzę, tylko że otoczenie dla 4 elementów
P-141244
1aam2am1
» 2015-12-01 20:28:22
Prosty algorytm rekursywny

1. Początek.
2. Aktualna pozycja usuń znak.
3. Jeżeli lewo jest znakiem szukanym -> algorytm();
4. Jeżeli prawo jest znakiem szukanym -> algorytm();
5. Jeżeli góra jest znakiem szukanym -> algorytm();
6. Jeżeli dół znakiem szukanym -> algorytm();
7. Zmienna++;
8. Koniec.
P-141245
Szadziu
» 2015-12-02 11:16:34
Zależy czy chcesz ukośne też znajdować
P-141274
« 1 »
  Strona 1 z 1