Процедура находит перестановку, следующую за данной в лексикографическом
порядке. Начальная перестановка задается в массиве X, туда же после работы
процедуры помещается найденная перестановка.
Скажем, для N равного 3 существуют шесть перестановок:
№1: 1 2 3
№2: 1 3 2
№3: 2 1 3
№4: 2 3 1
№5: 3 1 2
№6: 3 2 1
Входные параметры:
N - число элементов
X - массив с нумерацией элементов [1..N]
входная перестановка. Содержит числа от 1 до N.
Выходные параметры:
X - массив с нумерацией элементов [1..N]
перестановка, следующая за поданной на вход
Результат:
True, если процедура успешно завершена и X содержит следующую
перестановку.
False, если X является последней перестановкой или процедуре переданы
неверные параметры (не являющиеся числами от 1 до N).
*************************************************************************/
bool nextpermutation(ap::integer_1d_array& x, const int& n)
{
bool result;
int k;
int t;
int y;
//
// Check
//
if( n<=0 )
{
result = false;
return result;
}
for(k = 1; k <= n; k++)
{
if( x(k)<1||x(k)>n )
{
result = false;
return result;
}
}
//
// Process
//
k = n-1;
while(k>0)
{
if( x(k)<=x(k+1) )
{
break;
}
k = k-1;
}
if( k!=0 )
{
t = k+1;
while(t<n)
{
if( x(t+1)<=x(k) )
{
break;
}
t = t+1;
}
y = x(k);
x(k) = x(t);
x(t) = y;
t = 0;
while(t<(n-k)/2)
{
y = x(n-t);
x(n-t) = x(k+1+t);
x(k+1+t) = y;
t = t+1;
}
result = true;
}
else
{
result = false;
}
return result;
}
Построить гамильтонову цепь в графе, используя нерекурсивный алгоритм(c++ или Delphi)
Построить гамильтонову цепь в графе, используя нерекурсивный алгоритм генерации всех перестановок вершин в лексикографическом порядке
Если кто-то может помочь с листингом, то нет разницы на чем он будет написан - С++ или Object Pascal, в консольном исполнении или в "графическом".
1. Я так понимаю имеется у нас, допустим, граф G =(V,X), где V = {v1 ,v2 ,…,vn}. Ищем в нем Гамильтонову цепь методом перебора всевозможных перестановок vi1 ,vi2 ,…,vin множества V. Для каждой из них проверяем, является ли vi1vi2…vin маршрутом в G. Если является, то vi1vi2 …vin - гамильтонова цепь в G, в противном случае переходим к другой перестановке.
2. Здать граф думаю стоит с помощью матрицы.
3. В лексикографическом порядке - это, например:
множества X = {1,2,3} будет:
123, 132, 213, 231, 312, 321
4. Нерекурсивный - значит не использовать функций вызывающих себя из себя же.
В общем пока каша в голове. Кто сможет, помогите разобраться...
Есть такая штука - возвратный алгоритм.
Вот что-то похожее, но даже не знаю пока это преобразовать:
Код:
Может кто хорошо разбирается в этом?