Jak szybko wyszukac element w tablic dwuwymiarowej

Odpowiedz Nowy wątek
2013-01-01 20:23

Rejestracja: 7 lat temu

Ostatnio: 3 lata temu

0

Czy jest jakiś szybki sposób na wyszukanie danej litery w dwuwymiarowej tablicy charów?

Pozostało 580 znaków

2013-01-01 21:03

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

Lokalizacja: Opole

0

Zakładam ,że wypełnisz tablicę jakimiś sensownymi wartościami.
Można to rozwiązać mniej więcej tak:

char tab[20][20];
char * szukany = std::find(tab[0], tab[0] + 400, 'a');
++szukany;
// *szukany - tutaj się znajduje znaleziony znak

Nie odpowiadam na PW z prośbą o pomoc programistyczną.
edytowany 5x, ostatnio: robcio, 2013-01-03 17:17

Pozostało 580 znaków

2013-01-03 11:33

Rejestracja: 11 lat temu

Ostatnio: 3 lata temu

Sposób @robcio zadziała tylko, jeśli tablica jest jednym blokiem pamięci – działanie będzie błędne dla tablicy utworzonej dynamicznie. Poza tym jeśli znak nie zostanie odnaleziony to będzie czytanie poza zakresem tablicy. Ponadto iteracja do tab[0]+40 to o wiele za mało, bo w jego przykładzie tablica ma 400 elementów, a nie 40, ale powiedzmy, że to literówka.

Najprostszym rozwiązaniem będzie po prostu podwójna pętla:

std::pair<int, int> find2d(char** tab, int rows, int cols, char c) {
    for (int i = 0; i < rows; ++i)
        for (int j = 0; j < cols; ++j)
            if (tab[i][j] == c)
                return std::make_pair(i, j);
    return std::make_pair(-1, -1);
}

Funkcja zwraca parę współrzędnych (x, y) na których znajduje się poszukiwany znak, bądź parę (-1, -1) jeśli znak nie występuje w tablicy.


edytowany 1x, ostatnio: rincewind, 2013-01-03 11:34
No nie, wariant który podał @robcio jest szybszy. - _13th_Dragon 2013-01-03 13:26
Tak, ale tylko w sytuacji gdy tablica jest ciągłym blokiem. Nie zadziała dla tablicy dynamicznej: char* tab = new char[X]; for (int i = 0; i < X; ++i) tab[i] = new char[Y]; - rincewind 2013-01-03 18:40
Ponadto, jak już napisałem: wywali się, jeśli znak nie znajduje się w tablicy – to raz. No i przez niepotrzebną inkrementację nie zwróci prawidłowego wyniku, tylko o jeden dalej. - rincewind 2013-01-03 18:43

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0