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

pętla w pętli

Ostatnio zmodyfikowano 2019-12-11 22:47
Autor Wiadomość
Bartex321
Temat założony przez niniejszego użytkownika
pętla w pętli
» 2019-12-11 19:48:08
Witam
W moim programie posiadam następującą tablicę:

tablica [4n][x][y] // jest ona oczywiście deklarowana dynamicznie

muszę sprawdzić, czy co czwarta tablica ma takie same wartości, np.:

tablica[0][x][y] == tablica[4][x][y]
tablica[0][x][y] == tablica[5][x][y]
tablica[0][x][y] == tablica[6][x][y]
tablica[0][x][y] == tablica[7][x][y]
tablica[1][x][y] == tablica[4][x][y]
tablica[1][x][y] == tablica[5][x][y]
...
tablica[4][x][y] == tablica[8][x][y]

gdybym wiedział, że n będzie równe np.: 2 użył bym dwóch pętli for:
C/C++
for( int i = 0; i < 4; i++ )
{
    for( int j = 0; j < 4; j++ )
    {
        if( tablica[ i ][ x ][ y ] == tablica[ j ][ x ][ y ] )
        ...
    }
}
Analogicznie dla trzech, jednak jak rozwiązać to dla niewiadomej n?

Bardzo proszę, o w miarę możliwości szybką odpowiedź (mam czas jutro do północy) i z góry bardzo dziękuję :)
P-175766
pekfos
» 2019-12-11 20:02:36
Żeby sprawdzić czy wszystkie liczby są sobie równe nie musisz sprawdzać równości między każdą możliwą parą liczb. Jeśli A jest równe B i B jest równe C, to bez sprawdzania wiadomo że A jest równe C. Nie bardzo widzę, po co potrzebujesz tu więcej niż jednej pętli..
P-175768
Bartex321
Temat założony przez niniejszego użytkownika
» 2019-12-11 20:51:00
Troszke źle to opisałem lepsza bd taka tablica:
bool tablica[3][4][10][7] // n = 3, x = 10, y = 7
Wyobraźmy sobie taką tablicę jako 3 notatniki po 4 kartki 10x7 kratek każda.
W moim programie muszę znaleźć największą ilość pokolorowanych kratek, które się pokryją na dowolnie wybranej kartce z każdego notatnika(kratka pokolorowana = 1, czysta = 0)
Przykład:
tablica[0][0][5][3] = 1
tablica[1][2][5][3] = 1
tablica[2][0][5][3] = 1

Kratka 5 kolumna, 3 rząd jest pokolorowana na
Kartce 1 z 1 notatnika
Kartce 3 z 2 notatnika
Kartce 1 z 3 notatnika
Muszę zliczyć ilość pokrywających się w ten sposób kratek i największą ich ilość wypisać
P-175771
pekfos
» 2019-12-11 21:02:46
I w czym masz problem?
P-175772
Bartex321
Temat założony przez niniejszego użytkownika
» 2019-12-11 21:22:44
Muszę porównać każdą kartkę z każdą(poza kartkami z tego samego notesu) :
N - notes
K - kartka
N1 k1 z n2 k1 z n3 k1 ma x1 wspolnych kratek
N1 k1 z n2 k1 z n3 k2 ma x2 wspolnych kratek
...
N1 k1 z n2 k2 z n3 k1 ma x5 wspolnych kratek
...
N1 k2 z n2 k1 z n3 k1 ma x17 wspolnych kratek
...
N1 k4 z n2 k4 z n3 k4 ma x64 wspolnych kratek

Takich porownan bedzie 4 do potego n
Program powinien wyświetlić największy x
W pierwszym poście zamieściłem kod, jak napisałbym takie porównanie dla 2 notesów,  niestety notesów jest n, a nie można (przynajmniej ja nie umiem) napisac n pętli
P-175775
pekfos
» 2019-12-11 21:32:58
W moim programie muszę znaleźć największą ilość pokolorowanych kratek, które się pokryją na dowolnie wybranej kartce z każdego notatnika(kratka pokolorowana = 1, czysta = 0)
Królestwo za formalność! Dobrze to rozumiem? "Wyznacz ilość punktów na kartce papieru (10x7), takich że w każdym notesie istnieje kartka, która ma zamalowane to pole"?
P-175776
Bartex321
Temat założony przez niniejszego użytkownika
» 2019-12-11 21:41:15
Dziękuje za cierpliwość i przepraszam za nieudolność mojego tłumaczenia - nie

Załóżmy(wbrew warunkom zadania), że notesy mają jedną kartkę - wynikiem jest ilość kratek, które są zamalowane na wszystkich
Jeśli kratka w górnym lewym rogu jest pokolorowana w dwóch kartkach, a w trzeciej nie, to do wyniku się nie wlicza

Teraz powróćmy do zadania - każdy notes ma 4 kartki, zależnie od tego które weźmiesz, będą różne wyniki - mam wypisać największy z nich

Pozostałe 3 kartki w każdym notesie nie mają żadnego wpływu na wynik - porównujemy tylko jedną kartkę z notesu na raz
P-175777
pekfos
» 2019-12-11 22:02:27
Teraz wszystko jasne. Mając N notesów o K kartkach, wybór N kartek po jednej z każdego notesu jest wektorem ze zbioru K x K x K x ... x K. Iterujemy po wszystkich możliwych wektorach z tego iloczynu kartezjańskiego. W ogólnym przypadku można to zrobić właśnie przez N zagnieżdżonych pętli, ale dla K = 4, każdy numer kartki można zapisać jako 2 bity na odpowiedniej pozycji w liczbie. Licznik 32-bitowy starczy na 16 notesów, a raczej masz mniej. Jak nie to 64 bity. Ale powiedzmy że jest to przypadek ogólny notesów o np 100 kartkach. N pętli można uzyskać rekurencją:
C/C++
void f( int kartki, int notesy )
{
    if( notesy > 1 )
    for( int i = 0; i < kartki; ++i )
         f( kartki, notesy - 1 );
   
}
Przez to że pole musi być zamalowane na wszystkich kartkach z danego wyboru, jeśli kartka w notesie N1 ma jedno zamalowane pole, a aktualne maksimum to 5, nie ma sensu analizować dalej tego poddrzewa. To samo na każdym kroku, analizując powtarzające się kratki na kartkach z pierwszych M notesów. Jeśli interesuje Cię wyłącznie te liczbowe maksimum, do funkcji powyżej trzeba dorzucić tylko argument na maksimum (referencja) i aktualną mapę pokrywających się kratek po uwzględnieniu pierwszych M notesów (kopia!). Jeśli w dowolnym momencie maksimum z aktualnego stanu jest nie większe niż globalne aktualne maksimum, nie wchodź głębiej. Globalne maksimum zaktualizuj jeśli masz większą wartość po uwzględnieniu wszystkich notesów.
P-175778
« 1 » 2
  Strona 1 z 2 Następna strona