Wyszukiwanie permutacji pojedynczych elementow kolumny tablicy dwuwymiarowej

0

Witam!!

Podczas pisania pewnego programu napotkalem na pewien problem, ktory sprowadzilem do nastepujacego (innego, prostrzego) problemu, ktorego to nie moge rozwiazac :). Otóż chodzi o to, że mam tablice dwuwymiarowa a konkretnie vector zawierajacy wektor znakow (vector<vector<char>>) ktory na konkretnym przypadku wyglada tak:

1234
3
0
24
2

A wiec jest to tablica ktora sklada sie z 5 wierszy, z ktorych to pierwszy zawiera cztery elementy {1,2,3,4} drugi i trzeci zawieraja tylko po jednym {3} i {0}, czwarty zawiera dwa {2,4} i ostatni wiersz - jeden {2}.
Chodzi teraz o to, aby z kazdego wiersza wybrac tylko po jednym elemencie z kazdego wiersza, ale takim, aby ostatecznie wszystkie wybrane elementy sie nie duplikowaly.
Czyli w skrocie - dla tego konkretnego przypadku poprawnym rozwiazaniem bedzie wybranie z pierwszego wiersza elementu pierwszego, z drugiego, trzeciego i piatego wiersza nie mamy wyboru, zas z 4 wiersza wybieramy element drugi. I tak otrzymujemy o to zestaw liczb {1,3,0,4,2}. Elementy sie nie powtarzaja, a wiec jest okej.

Nastepnie trzeba to "przekodzic". Wymyslilem, ze najprostrzym algorytmem do rozwiazania tego typu zadania bedzie po prostu wybranie wszystkich kombinacji, a nastepnie odsrotowanie tylko tych, w ktorych elementy sie nie powtarzaja.
Metodą "na pałę" dla tego konkretnego problemu, mozna to zrobic tak:

       vector<int> kombinacja;

	kombinacja.push_back(tablicaIndexow[0][0]);
	kombinacja.push_back(tablicaIndexow[1][0]);
	kombinacja.push_back(tablicaIndexow[2][0]);
	kombinacja.push_back(tablicaIndexow[3][0]);
	kombinacja.push_back(tablicaIndexow[4][0]);
	
	sprawdzKombinacje(kombinacja);
	kombinacja.clear();

	kombinacja.push_back(tablicaIndexow[0][1]);
	kombinacja.push_back(tablicaIndexow[1][0]);
	kombinacja.push_back(tablicaIndexow[2][0]);
	kombinacja.push_back(tablicaIndexow[3][0]);
	kombinacja.push_back(tablicaIndexow[4][0]);
	
	sprawdzKombinacje(kombinacja);
	kombinacja.clear();

	kombinacja.push_back(tablicaIndexow[0][2]);
	kombinacja.push_back(tablicaIndexow[1][0]);
	kombinacja.push_back(tablicaIndexow[2][0]);
	kombinacja.push_back(tablicaIndexow[3][0]);
	kombinacja.push_back(tablicaIndexow[4][0]);
	
	sprawdzKombinacje(kombinacja);
	kombinacja.clear();

	kombinacja.push_back(tablicaIndexow[0][3]);
	kombinacja.push_back(tablicaIndexow[1][0]);
	kombinacja.push_back(tablicaIndexow[2][0]);
	kombinacja.push_back(tablicaIndexow[3][0]);
	kombinacja.push_back(tablicaIndexow[4][0]);
	
	sprawdzKombinacje(kombinacja);
	kombinacja.clear();

	kombinacja.push_back(tablicaIndexow[0][0]);
	kombinacja.push_back(tablicaIndexow[1][0]);
	kombinacja.push_back(tablicaIndexow[2][0]);
	kombinacja.push_back(tablicaIndexow[3][1]);
	kombinacja.push_back(tablicaIndexow[4][0]);
	
	sprawdzKombinacje(kombinacja);
	kombinacja.clear();

	kombinacja.push_back(tablicaIndexow[0][1]);
	kombinacja.push_back(tablicaIndexow[1][0]);
	kombinacja.push_back(tablicaIndexow[2][0]);
	kombinacja.push_back(tablicaIndexow[3][1]);
	kombinacja.push_back(tablicaIndexow[4][0]);
	
	sprawdzKombinacje(kombinacja);
	kombinacja.clear();

	kombinacja.push_back(tablicaIndexow[0][2]);
	kombinacja.push_back(tablicaIndexow[1][0]);
	kombinacja.push_back(tablicaIndexow[2][0]);
	kombinacja.push_back(tablicaIndexow[3][1]);
	kombinacja.push_back(tablicaIndexow[4][0]);
	
	sprawdzKombinacje(kombinacja);
	kombinacja.clear();

	kombinacja.push_back(tablicaIndexow[0][3]);
	kombinacja.push_back(tablicaIndexow[1][0]);
	kombinacja.push_back(tablicaIndexow[2][0]);
	kombinacja.push_back(tablicaIndexow[3][1]);
	kombinacja.push_back(tablicaIndexow[4][0]);
	
	sprawdzKombinacje(kombinacja);
	kombinacja.clear();
 

Jednak poniewaz owa tablica dwuwymiarowa (czy jakkolwiek to nazwac) nie zawsze ma taki rozmiar i takie elementy, nalezaloby ta metode jakos sparametryzowac. I tu prosze o pomoc, poniewaz totalnie nie mam pomyslu jak to zrobic.
Czy ktos moglby mi cos podpowiedziec?

Z gory dzieki za odpowiedzi!

0

Witam!!

Podczas pisania pewnego programu napotkalem na pewien problem, ktory sprowadzilem do nastepujacego (innego, [błąd ortograficzny]) problemu, ktorego to nie moge rozwiazac :). Otóż chodzi o to, że mam tablice dwuwymiarowa a konkretnie vector zawierajacy wektor znakow (vector<vector<char>>) ktory na konkretnym przypadku wyglada tak:

1234
3
0
24
2
Znane, problem znalezienia skojarzenia skojarzenia doskonałego w grafie dwudzielnym. Poszukaj. Tylko zaznaczam, że istnieje szybsze rozwiązanie, niż znalezienie skojarzenia maksymalnego i sprawdzenie, czy jest doskonałe.
Twój lewy zbiór wierzchołków grafu dwudzielnego to kolumny, a prawy to liczby. Krawędź z kolumny do liczby istnieje wtw. liczba jest w danej kolumnie. Skojarzenie doskonałe to podzbiór zbioru krawędzi taki, że dla z każdego wierzchołka z lewego zbioru wychodzi jedna krawędź i żadna nie dochodzi do tej samej liczby. Czyli tego szukasz.

Nie ma tutaj bb codes, mamy <b>pseudohtml</b> <i>codes</i> (poprawiłem) - msm

0

Okej, wielkie dzieki za odpowiedz. Jednakze nie da sie tego podpiac pod jakis latwiejszy problem/algorytm??
Chodzi przeciez tylko o znalezienie permutacji zbioru liczb [0,1,2,3,4], z ograniczeniem, ze na pierwszej pozycji moze byc tylko liczba ze zboru [1,2,3,4], na drugiej pozycji tylko [3], na trzeciej [0], na czwartej [4,2] i na piatej [4] ?

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