Яндекс.Метрика

Пример использования 1С для решения математических задач

Приветствую всех читателей. Хочу показать небольшой пример использования 1С, для решения математических задач. Итак, задача следующая, дан числовой треугольник. Наша задача найти дорогу от вершины до низа треугольника, которая даст максимальную сумму всех пройденных чисел.

 

Пример, дан треугольник

2

1   3

4   1   5

4   1   7   1

С вершины (2), вы можете пойти либо на (1), либо на (3), если вы выбрали путь на (3), следующим ходом вы можете пойти либо на (1) либо на (5), если вы выбрали (5), следующим будет выбор между (7) и (1). Для данного примера максимальная сумма будет 2+3+5+7=17

Ничего сложного, но если взять числовой треугольник, изображенный ниже, то задача усложняется.

74
78 22 
28 10 16 
17 35 10 61 
78 86 48 18 49 
12 43 86 65 5 46 
80 61 87 37 80 10 0 
2 78 61 36 74 59 0 25 
61 5 34 31 5 52 92 15 26 
12 85 94 69 31 55 82 44 73 28 
96 9 40 36 73 83 45 84 15 50 39 
63 75 89 32 40 44 76 52 84 88 12 64 
9 71 77 15 24 47 28 79 43 0 80 39 86 
95 37 7 69 31 67 75 76 30 39 64 52 6 62 
85 62 87 94 55 2 95 14 20 64 92 68 76 93 59 
48 4 73 66 48 31 39 45 8 23 9 80 51 44 73 59 
69 28 92 80 8 89 79 83 49 28 74 57 27 22 46 50 80 
9 69 73 48 12 52 79 76 41 39 55 62 90 85 64 76 7 0 
26 29 0 91 15 73 24 62 13 64 47 51 64 15 84 0 96 13 68 
98 22 97 89 53 24 4 0 58 90 31 2 65 71 83 44 19 34 93 92 
42 74 33 61 43 4 60 9 51 2 65 50 2 24 16 29 46 93 4 44 38 
26 52 41 30 53 41 9 75 50 42 22 39 93 84 51 37 88 94 14 67 45 72 
29 15 0 96 22 20 13 83 72 60 71 29 10 90 96 17 5 9 35 68 0 82 61 
62 77 32 50 68 81 51 70 47 6 28 31 26 34 82 66 60 11 39 39 20 40 2 16 
70 71 98 26 42 16 11 10 8 80 10 34 0 47 60 14 46 7 63 59 9 31 53 79 48  

Вот ссылка http://admin2011.ru/images/quest/tr.txt на полную версию числового треугольника. Перейдем непосредственно к обработке. Привожу текст процедуры и функции, которые я использовал.

 

Функция ПолучитьНомер(стр)
Темп = "";
АА = Новый Массив;
Длина = СтрДлина(Стр);
НачНом = 1;
Для ном = 1 По Длина Цикл
СимволСтр = Сред(Стр, ном, 1); 
Если (КодСимвола(СимволСтр) = 32) Тогда  // 32 - код пробела
АА.Добавить(Сред(Стр, начНом, (ном-начНом)+1));
НачНом = ном;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Возврат АА;
КонецФункции
 
 
Процедура Сформировать()
Попытка
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("tr.txt", КодировкаТекста.ANSI);
               // tr.txt -  текстовый файл с нашим числовым треугольником
Исключение
сообщить("Файл tr.txt не найден!!!");
возврат;
КонецПопытки;
Сумм = 0;
Флаг = 0;
АБ = Новый Массив;
Для ном = 1 По Текст.КоличествоСтрок() Цикл
стр = Текст.ПолучитьСтроку(ном);
Если ном = 1 Тогда
Сумм = Число(Сумм) + Число(СокрЛп(Стр));
Иначе
АБ = ПолучитьНомер(стр);
Если Число(АБ[флаг]) > Число(АБ[флаг+1]) Тогда
Сумм = Число(Сумм) + Число(АБ[флаг]);
Иначе
Сумм = Число(Сумм) + Число(АБ[флаг+1]);
флаг = Число(флаг) + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Сообщить(Сумм);
КонецПроцедуры
 
С помощью функции "ПолучитьНомер()" я считываю строку из файла, выбираю из нее числа и заношу их в массив.

 

Ваше имя

Отзыв

Отправить
Максим
Прикольно. Теперь буду использовать эту функцию.
Ответ:
Всегда пожалуйста :)

photo

Всем привет,  меня зовут Тимур. Я работаю программистом 1С.

Хочу поблагодарить моего друга Александра,
благодаря которому появился на свет этот блог

создание сайтов в симферополе