artugam Temat założony przez niniejszego użytkownika |
Problem z zagnieżdzonymi petlami » 2017-02-13 18:35:11 Czy ktoś może dać mi wskazówke jak używając petli for program wypisze wszsytkie możliwe kombinacje ich ułożenia? Np. Majać liczbe 1 i 2 żeby wypisało takie coś: 1 1 1 2 2 1 2 2
Kompletnie nie wiem jak to napisać. Dzięki i pozdrawiam. Problem rozwiązany. |
|
Nazgul |
» 2017-02-14 01:33:28 jak masz tablicę chociażby tych intów to:
masz ją posortowaną w określony sposób
1, 2, 3, 4, 5 - rozmiar tablicy = 5
bierzesz 1 masz 2, 3, 4, 5 wstawiasz 1 na pierwszym miejscu, masz 1, 2, 3, 4, 5 bierzesz, wstawiasz na 2 miejsce 2, 1, 3, 4, 5 bierzesz, wstawiasz na 3 miejsce, 2, 3, 1, 4, 5 i razy i = rozmiar tablicy
i ten algorytm powtarzasz dla każdej komórki tablicy, czyli razy j=rozmiar tablicy
|
|
Nazgul |
» 2017-02-14 01:51:00 domyślam się, że jesteś biednym studenciakiem w czasie sesji, to trzymaj #include <deque> #include <iostream>
void wyswietl_tablice( std::deque < int >& tablica ) { for( unsigned int i = 0; i < tablica.size(); i++ ) std::cout << tablica[ i ] << ", "; std::cout << std::endl; }
void wyswietl_wszystkie_mozliwosci( std::deque < int >& tablica ) { unsigned int rozmiar_tablicy = tablica.size(); wyswietl_tablice( tablica ); for( unsigned int i = 0; i < rozmiar_tablicy; i++ ) { int value = tablica[ i ]; tablica.erase( tablica.begin() + i ); for( unsigned int j = 0; j < rozmiar_tablicy; j++ ) { if( i != j ) { tablica.insert( tablica.begin() + j, value ); wyswietl_tablice( tablica ); tablica.erase( tablica.begin() + j ); } } tablica.insert( tablica.begin() + i, value ); } }
int main() { std::deque < int > tablica; tablica.resize( 6 ); tablica[ 0 ] = 1; tablica[ 1 ] = 2; tablica[ 2 ] = 3; tablica[ 3 ] = 4; tablica[ 4 ] = 5; tablica[ 5 ] = 6; wyswietl_wszystkie_mozliwosci( tablica ); std::cin.ignore(); return 1; }
Zaznaczam, że program jest kompletnie niezoptymalizowany, można to zrobić o wiele lepiej, ale teraz nie mam weny na kombinowanie, ma to pokazać samą idee /EDIT był błąd, nie wziąłem pod uwagi jednego warunku.. żeby nie powtarzało "1, 2, 3, 4, 5", czyli żeby nie brało pod uwagę kombinacji, kiedy element tablicy jest na swoim oryginalnym miejscu(wystarczy raz wyświetlić oryginalną (pierwszą) kombinację, a potem przy każdym wyśwetleniu dodać warunek(if i != j).. (już zedytowałem kod, także nie szukajcie go) |
|
michal11 |
» 2017-02-14 09:58:45 O panie. Jeżeli już korzystasz z stl'a (deque) to możesz użyć też innych ciekawych funkcji #include <iostream> #include <algorithm> #include <vector>
int main() { int size; std::cin >> size; std::vector < int > tab( size ); std::iota( tab.begin(), tab.end(), 1 ); do { for( int el: tab ) { std::cout << el; } std::cout << std::endl; } while( std::next_permutation( tab.begin(), tab.end() ) ); return 0; }
|
|
Nazgul |
» 2017-02-14 10:40:42 Przecież napisałem, że nie zoptymalizowałem, że kombinować nie miałem czasu;P szczerze mówiąc, nie orientuję się perfekcyjnie w STL'u, tylko kontenery jakoś tam, a stwierdziłem, że przesuwanie non stop vectora będzie gorsze niż skakanie po queue(mogę się mylić) w każdym razie chyba autorowi tematu chodziło jednak o inną funkcję;D kod: #include <vector> #include <string> #include <iostream> #include <math.h> int main() { std::vector < std::string > tablica_znakow; tablica_znakow.push_back( "0" ); tablica_znakow.push_back( "1" ); tablica_znakow.push_back( "2" ); tablica_znakow.push_back( "3" ); tablica_znakow.push_back( "4" ); tablica_znakow.push_back( "5" ); tablica_znakow.push_back( "6" ); tablica_znakow.push_back( "7" ); tablica_znakow.push_back( "8" ); tablica_znakow.push_back( "9" ); uint64_t size = tablica_znakow.size(); uint64_t maksymalna_wartosc = pow( size, size ); uint64_t variable1 = 0; uint64_t variable2 = 0; for( uint64_t i = 0; i < maksymalna_wartosc; i++ ) { variable1 = i; for( uint64_t j = size; j > 0; j-- ) { variable2 = pow( size, j - 1 ); std::cout << tablica_znakow[( uint64_t )( variable1 / variable2 ) ] << ","; variable1 = i % variable2; } std::cout << std::endl; } std::cin.ignore(); return 1; }
jednak również nie wiem, czy operacja dzielenia na uint64_t jest w 100% bezpieczna;D |
|
« 1 » |