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: 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ę :) |
|
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.. |
|
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ć |
|
pekfos |
» 2019-12-11 21:02:46 I w czym masz problem? |
|
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 |
|
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"? |
|
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 |
|
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ą: 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. |
|
« 1 » 2 |