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

Problem z zagnieżdzonymi petlami

Ostatnio zmodyfikowano 2017-02-14 10:40
Autor Wiadomość
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.
P-157672
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
P-157688
Nazgul
» 2017-02-14 01:51:00
domyślam się, że jesteś biednym studenciakiem w czasie sesji, to trzymaj

C/C++
#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)
P-157689
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
C/C++
#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;
}
P-157691
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:
C/C++
#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
P-157693
« 1 »
  Strona 1 z 1