// *Permutation* by Krzysztof Bosak 1999-02-14 #include #include #include class PermutateWord { char *_buffer, *_reftab, *_maxtab; void per(char *tab) { char *temp1=_buffer+(tab-_reftab); *temp1=*tab; if(tab<_maxtab) { char *tab1=tab+1; char temp; per(tab1); for(char *xtab=tab1; xtab<=_maxtab; xtab++) { temp=*tab; *tab=*xtab; *temp1=*tab; *xtab=temp; per(tab1); *xtab=*tab; *tab=temp; } } else puts(_buffer); } const PermutateWord& operator=(const PermutateWord&); PermutateWord(const PermutateWord&); public: PermutateWord(char *tab) { _reftab=tab; char const l=static_cast(strlen(tab)); _buffer=new char[l+1]; assert(_buffer); _buffer[l]='\0'; _maxtab=tab+l-1; per(tab); } ~PermutateWord() { delete[] _buffer; } }; class Permutate { char *_buffer, *_reftab, *_maxtab; void (*_function)(char*); void per(char *tab) { char *temp1=_buffer+(tab-_reftab); *temp1=*tab; if(tab<_maxtab) { char *tab1=tab+1; char temp; per(tab1); for(char *xtab=tab1; xtab<=_maxtab; xtab++) { temp=*tab; *tab=*xtab; *temp1=*tab; *xtab=temp; per(tab1); *xtab=*tab; *tab=temp; } } else _function(_buffer); } const Permutate& operator=(const Permutate&); Permutate(const Permutate&); public: Permutate(char len, void (*fun)(char*)) { assert(len); assert(fun); _function=fun; _reftab=new char[len]; assert(_reftab); for(char c=0; c