[C++] Kombinacje bez powtorzeń z tablicy dwuwymiarowej


(Dodebillo) #1

Witam,

mój problem jest dość prozaiczny. Mam tablice char**, w której zapisane są poszczególne znaki np:


(tomms) #2
#include <vector>
#include <string>
#include <iostream>

typedef std::vector<std::string> MyTab;


void swinka(const MyTab & tab, std::string & stack, size_t level)
{
	for(char c : tab[level])
	{
		stack += c;

		if( level + 1 < tab.size() )
			swinka(tab, stack, level + 1);
		else
			std::cout << stack << std::endl;

		stack.pop_back();
	}
}


void swinka(const MyTab & tab)
{
std::string stack;
	
	if( !tab.empty() )
		swinka(tab, stack, 0);
}


int main()
{
MyTab my_tab = {"asdf", "zxcv", "klp", "rtuiop"};

	swinka(my_tab);
}

$ clang++ -o swinka -std=c++11 swinka.cpp
$ ./swinka | head -n 5
azkr
azkt
azku
azki
azko
$ ./swinka | wc -l
     288

(Dodebillo) #3

Dzięki :wink: A gdyby to tak przenieść do starszego standardu? Niestety nie mogę wykorzystać C++11 Wymyśliłem taki kod, jednak zawiesza się:

 

#include <iostream>
#include <string>
#include <list>
 
using namespace std;
 
char rozw[2][9];
 
int size =0;
 
string stack;
 
void kombinuj(const char **tab, int level){
const char *str = tab[level];
 
cout << str;
int i=0;
do{
cout << "--" << str[i] << "--" << endl;
stack += str[i];
if(level<size){
kombinuj(tab, level+1);
}
i++;
cout << "Stack: " << stack << endl;
stack.clear();
}while(str[i]!= '\0');
}
 
void fun(list<string> tab){
size = tab.size();
cout << "Rozmiar: " << size << endl;
const char **c = new const char*[size];
int i = 0;
for (list<string>::iterator iter = tab.begin(); iter != tab.end(); iter++, i++){
cout << *iter << endl;
c[i] = new char[iter->length()];
c[i] = iter->c_str();
}
cout << "START" << endl;
kombinuj(c, 0);
}
 
 
 
int main(){
list<string> tab;
 
tab.push_back("abc");
tab.push_back("xyz");
tab.push_back("klo");
 
fun(tab);
 
return 0;
}