znajdź pary, których różnica jest równa liczbie k

0

Witam mam taki kodzik i ogólnie pokazuje mi dobre pary ale chodzi mi o wyeliminowanie powtórzeń tak aby wypisywał mi tylko
[5,2] oraz [4,1]

using namespace std;
int main()
{  int i=0;
    int j;
    int k=3;
    int tab[]={1,5,2,2,2,5,5,4};


    while(i<=7)
    {
         for(j=i+1;j<=7;j++){
        if((tab[i]-tab[j]==k)||(tab[j]-tab[i]==k))
            {cout<<"["<<tab[i]<<","<<tab[j]<<"]";
            }}
        i++;
    }
    return (0);
}
1

Utwórz sobie kontener unordered_set wypisanych już par, i wypisuj tylko jeśli danej pary nie ma w zbiorze już wypisanych. W zależności od potrzeb, możesz chcieć normalizować pary (np. jeśli chcesz traktować [1, 2] jako to samo co [2, 1])

0
kq napisał(a):

Utwórz sobie kontener unordered_set wypisanych już par, i wypisuj tylko jeśli danej pary nie ma w zbiorze już wypisanych. W zależności od potrzeb, możesz chcieć normalizować pary (np. jeśli chcesz traktować [1, 2] jako to samo co [2, 1])

Nigdy z tego nie korzystałem, a raczej zaczynam przygodę z c++, mógłbyś łopatologicznie na przykładzie jakiegoś kodu wytłumaczyć? Byłbym bardzo wdzięczny.

0

Nie kompilowałem, ale mniej więcej coś takiego:

int main()
{  int i=0;
    int j;
    int k=3;
    int tab[]={1,5,2,2,2,5,5,4};
    unordered_set<pair<int, int>> displayed;
    while(i<=7)
    {
         for(j=i+1;j<=7;j++){
        if((tab[i]-tab[j]==k)||(tab[j]-tab[i]==k))
            {
            auto ret = displayed.insert({tab[i], tab[j]});
            if (ret.second)
                cout<<"["<<tab[i]<<","<<tab[j]<<"]";
            }}
        i++;
    }
    return (0);
}
0

screenshot-20201026194850.png

0

#include <unordered_set>

A na przyszłość polecam taką przydatną stronkę: link

0
kq napisał(a):

#include <unordered_set>

A na przyszłość polecam taką przydatną stronkę: link

Dodałem to wcześniej, ale wyskoczyło mi coś takiego więc usunąłem.
screenshot-20201026195614.png

0

Masz C++11 albo wyższe włączone? Dorzuć jeszcze #include <utility>

0
kq napisał(a):

Masz C++11 albo wyższe włączone? Dorzuć jeszcze #include <utility>

mam włączone, dorzuciłem, nadal to samo :(

0

Hm, chyba trzeba by napisać własną funkcję hashującą dla par... Użyj set zamiast unordered_set i powinno śmigać.

0

@Patryk Kijanka: pytanie: dlaczego chcesz wyeliminować powtórzenia?


PS. Pytam o to, ponieważ może elimowanie ich jest mniej intuicyjne w Twoim zadaniu niż nie eliminowanie. Z mojej perspektywy w danych wejściowych, dajmy na to, k równe 1 oraz tablica zawierająca liczby 1, 2, 2 oraz 3 obie dwójki nie muszą oznaczać tej samej dwójki. Jeśli zaś nie oznaczałyby, to można by uznać, że w wyniku działania algorytmu, czyli [(1, 2), (1, 2), (2, 3), (2, 3)], nie ma par powtarzających się.

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