Re: коммивояжёр
- From
- Vladimir Vassilevsky (2:5020/175.2)
- To
- Oleg Khovayko
- Date
- 2003-01-12T06:36Z
- Area
- RU.ALGORITHMS
From: "Vladimir Vassilevsky" <vlv@fullnet.net>
Hi Oleg,
Sun Jan 12 2003 06:03, Oleg Khovayko wrote to Ilya Rogov:
>> Вот про генерацию всех возможных перестановок нерекурсивным
OK> способом я как
>> раз и хотел спросить.
Нет ничего проще. Вообще-то, за 14+ лет моей практики я ни разу не
встречал задач, для которых была бы нужна рекурсия.
Приведите, пожалуйста, пример реальной задачи, которую было бы удобно
решать рекурсивно.
OK> Так как я пишу на C++, я при необходимости просто зову
OK> next_permutation(), и все делается за меня само собою.
То есть сразу сгенерить произвольно заданную i-тую пермутацию нельзя?
Плохо :)))))
OK> Вам же, если вы используете PASCAL, надо самому сгенерить перестановки.
PASCAL - мертвый язык.
OK> Вот я нашел в интернете описание генерации перестановок как раз
OK> применительно к комми-задаче:
По третьему разу, генерация любой i-той перестановки, без всяких
рекурсий и итераций:
//(c) VLV
#include <stdio.h>
unsigned int Factorial(unsigned int n)
{
unsigned int i,f = 1;
for(i = 2; i <= n; i++) f *= i;
return f;
}
//-----------------------------------------------
// Generate combination i from n! combinations
//
//
void GetCombination(unsigned int *c, unsigned int n, unsigned int i)
{
unsigned int j,k,l,m;
for(k = 0; k < n; k++) c[k] = n;
m = 0;
j = Factorial(n);
for(k = n; k >= 1; k--)
{
j /= k;
l = i/j;
i -= l*j;
l++;
do {
do {
if(++m == n) m = 0;
} while(c[m] != n);
} while(--l);
c[m] = k-1;
}
}
//--------------------------------------------
//
#define N 5
void main(void)
{
unsigned int i,j,Nfact;
unsigned int c[N];
Nfact = Factorial(N);
for(i=0;i<Nfact;i++)
{
GetCombination(c, N, i);
printf("\n");
for(j=0;j<N;j++) printf(" %u",c[j]);
}
printf("\n");
}
"SEX: parity error! Retry, Abort, Ignore?"
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)