Ваш алгоритм крайне прост (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено 30 ноября 2003 г. 18:12
В ответ на: задачка - требует решения ! отправлено zet 30 ноября 2003 г. 14:51

Как известно, количество подстановок на множестве X, имеющем мощнось n=|X|, равно n!. Для 7-сегментного индикатора имеем мощность множества сегментов, равную 7-ми, значит для перебора всех возможных перестановок необходимо всего лишь не более 5040 циклов - не так и много, можно решить задачу перебором.

Для начала сформируем множество сегментов из масива из 7-ми элементов X, содержащим числа 1..7 в порядке возрастания. Далее находим все перестановки, пользуясь например следующим алгоритмом (на С-образном языке, возвращает перестановки в антилексикографическом порядке):

void Process(int m) {
if (m==0) {
Validate(X);
} else {
for (i=0; i<m; i++) {
Process(m-1);
if (i j=0; k=m-1;
while (j<k) Swap(&X[j++],&X[k--]);
}
}
}

Осталось написать функцию Validate, которая проверит, подходит ли данная перестановка заданным условиям (а это не сложно, проверив по маске подключенных сегментов соответствие выходов заданному для любых трех цифр входного кода). И выдать всех их, подходящих, на гора. Функция Swap меняет местами два элемента массива.


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru