Полное факториальное моделирование равномерных последовательностей…
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 5
141
//------------------------------------------------------------
static public int FreeValue(int[] q, int n, int z)
{ for (int k = 1; k <= n; k++)
{ int j = 0;
for (; j <= z; j++)
if (q[j] == k) break;
if (j > z) return k;
}
return 0;
}
//------------------------------------------------------------
static public int NextFreeValue(int[] q, int n, int z)
{ int v = q[z] + 1; // возможное значение
if (v > n) return 0; // увеличение невозможно
for (; v <= n; v++) // область возможных значений
{ int j = 0; // начало проверки
for (; j < z; j++) // элементы до z-позиции
if (q[j] == v) break; // значение не принято
if (j >= z) break; // ранее значения v не было
}
if (v > n) v = 0;
return v; // следующее свободное значение
}
//------------------------------------------------------------
static public int ProcessUp(int[] q, int n)
{ int z = n - 2; // предпоследняя z-позиция
while (true)
{ int nv = NextFreeValue(q, n, z);
if (nv != 0) // смещение z влево не требуется
{ q[z] = nv; // следующее свободное число
while (++z < n) // z-позиции до конца
q[z] = FreeValue(q, n, z - 1);
return z;
}
if (z == 0) break; // последовательности нет
z--; // z-позиция слева
}
return 0; // следующей последовательности нет
}
}
}
Функция
NextFreeValue()
определяет следующее свободное число для
позиции
z
. Это число должно быть минимальным и не совпадать ни с одним
числом, находящимся в позициях до позиции
z
. Если такое число найти нельзя,
то формируется отказ. Функция
FreeValue()
определяет минимальное число,
которое должно находиться справа от позиции
z
. Функция
ProcessUP()
по-
следовательно манипулирует функциями
NextFreeValue()
и
FreeValue()
,
получая в итоге новую последовательность, которая непосредственно должна
следовать за исходной последовательностью.
После выполнения программы
P010301
на мониторе появляется следующий
листинг, который здесь приведен с сокращениями (на месте опущенных строк
стоит прочерк):
r = 1 q = 1 2 3 4 5 6 7
r = 2 q = 1 2 3 4 5 7 6