Ето ти една идея, не е от най-засуканите, но каточели работи, дано да съм те разбрала правилно:
template <typename T>
void outArray(unsigned int count, T* array, T* &out_array){
for(unsigned int k = 0; k < count; k++)
*(out_array+k) = array[k];
out_array = out_array + count;
}
template <typename T>
void permutation(unsigned int count, T* in_array, T* &out_array, unsigned int initial_count= 0){
if(count > initial_count)
initial_count = count;
if(count == 1){
outArray<T>(initial_count, in_array - initial_count + 1, out_array);
return ;
}
for(unsigned int k = 0; k< count; k++){
T hlp = in_array[0];
in_array[0] = in_array[k];
in_array[k] = hlp;
permutation(count-1, in_array+1, out_array, initial_count);
in_array[k] = in_array[0];
in_array[0] = hlp;
}
}
unsigned P(unsigned int num){
unsigned int res = num;
while(--num)
res*= num;
return res;
}
int _tmain(int argc, _TCHAR* argv[])
{
const unsigned int count = 4;
unsigned int out_count = P(count) * count;
int arro[] = {1, 2, 3, 4};
int* const out_arro = new int[out_count];
int* out = out_arro;
permutation<int>(count, arro, out);
while(out_count--){
printf("%d ", out_arro[out_count]);
if(out_count%count == 0)
printf("\n");
}
delete[] out_arro;
system("pause");
return 0;
}
Редактирано от Om_ на 25.09.08 15:56.