Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2013, 16:12   #1
Boggart
 
Регистрация: 24.10.2013
Сообщений: 6
По умолчанию Олимпиадная задача - восстановить направление движения робота

Програміст Вася сконструював робота, та першим ділом вирішив його протестувати. Він встановив на прямій ділянці з кінцями A та Б деяку кількість контрольних точок. Коли робот наближається до такої точки, йому передається команда і він записує її. Робот починає свій рух з одного кінця ділянки, закінчує в другій, та на кожну контрольну точку витрачає одну секунду.
По задумці Васі робот має записувати команди періодично через деякі проміжки часу. Протягом кожного періоду робот записує всі команди, що отримав, при цьому періоди не перетинаються в часі. Але після завершення тестування Вася з’ясував, що відлагодив програму погано, і йому вдалося відновити лише перші два періоди запису. Тепер він хоче з’ясувати, чи вірно він відновив дані, але не пам'ятає, з якого кінця ділянки робот почав рух.

Вхідні дані:
У першому рядку файлу z3.dat міститься рядок S – послідовність команд на шляху від А до Б. В другому рядку містяться записані команди s1 - за перший період запису. Третій рядок містить записані команди s2 - другий період запису. Команди задані в хронологічному порядку. Всі три рядка непусті та складаються з малих літер латинського алфавіту. Однакові літери відповідають однаковим командам, а різні - різним. Довжина рядків не менша 1 та не більша 2*104
Вихідні дані:
У файл z3.sol вивести одне з чотирьох слів:
"AB", Якщо робот рухався від А до Б.
"BA", Якщо робот рухався від Б до А.
"ABA", Якщо робот міг рухатися як від А до Б, так і від Б до А.
"NO", Якщо Вася отримав помилкові дані.

Приклад вхідних та вихідних даних.

dbcbabbc BA
cb
abc


aaacaaa ABA
aca
aa



Пояснення:
На шляху від Б до А точки розташовані в порядку "cbbabcbd". Послідовність "cb" була записана за перші дві секунди, а послідовність "abc" протягом секунд 4,5,6. А ось на шляху від А до Б послідовність "abc" не зустрічається жодного разу.
Boggart вне форума Ответить с цитированием
Старый 03.11.2013, 02:01   #2
Boggart
 
Регистрация: 24.10.2013
Сообщений: 6
По умолчанию

Программист Вася сконструировал работа , и первым делом решил его протестировать . Он установил на прямом участке с концами A и Б некоторое количество точек . Когда робот приближается к такой точке , ему передается команда и он записывает ее . Робот начинает свое движение с одного конца участка , заканчивает во второй , и на каждую контрольную точку тратит одну секунду .
По задумке Васи робот имеет записывать команды периодически через некоторые промежутки времени. В течение каждого периода робот записывает все команды, получил , при этом периоды не пересекаются во времени. Но после завершения тестирования Вася выяснил , что видлагодив программу плохо , и ему удалось восстановить только первые два периода записи . Теперь он хочет выяснить, верно он восстановил данные , но не помнит , с какого конца участка робот начал движение .

Входные данные :
В первой строке файла z3.dat содержит строку S - последовательность команд на пути от А к Б. Во второй строке содержатся записанные команды s1 - за первый период записи . Третья строка содержит записанные команды s2 - второй период записи . Команды заданные в хронологическом порядке. Все три строки непустые и состоят из букв латинского алфавита. Одинаковые буквы соответствуют одинаковым командам , а различные - разным. Длина строк не менее 1 и не более 2 * 104
Выходные данные:
В файл z3.sol вывести одно из четырех слов:
" AB " , если робот двигался от А до Б.
" BA " , если робот двигался от Б к А.
" ABA " , если робот мог двигаться как от А до Б , так и от Б к А.
" NO " , если Вася получил ошибочные данные .

Пример входных и выходных данных.
dbcbabbc BA
cb
abc


aaacaaa ABA
aca
aa

объяснение:
На пути от Б к А точки расположены в порядке "cbbabcbd". Последовательность "cb" была записана за первые две секунды, а последовательность "abc" в течение секунд 4,5,6. А вот на пути от А до Б последовательность "abc" не встречается ни разу.
Boggart вне форума Ответить с цитированием
Старый 03.11.2013, 02:02   #3
Boggart
 
Регистрация: 24.10.2013
Сообщений: 6
По умолчанию

Ребята погомите, пожалуйста.Трое суток уже сижу над ней. Любые идеи приветствуются.
Boggart вне форума Ответить с цитированием
Старый 03.11.2013, 02:16   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,293
По умолчанию

Если я понял задание, то:
Код:
const
  s: array[0..3] of string = ('NO', 'AB', 'BA', 'ABA');
...
k := pos(s2, s1);
ab := ((k > 0) and (pos(s3, copy(s1, k + length(s2), length(s1) - k - length(s2) + 1) > 0));
//перевернуть строку s1
k := pos(s2, s1);
ba := ((k > 0) and (pos(s3, copy(s1, k + length(s2), length(s1) - k - length(s2) + 1) > 0));
writeln(s[ord(ab) + 2 * ord(ba)]);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 03.11.2013 в 22:24.
BDA на форуме Ответить с цитированием
Старый 03.11.2013, 21:42   #5
Boggart
 
Регистрация: 24.10.2013
Сообщений: 6
По умолчанию

раскажите, пожалуйста, что такое ab i ba i (s[ord(ab) + 2 * ord(ba)]); это как?
Boggart вне форума Ответить с цитированием
Старый 03.11.2013, 21:48   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,293
По умолчанию

ab и ba - булевы переменные, которые показывают, что робот мог двигаться по соответствующему маршруту. Для краткой записи вывода нужного сообщения используется массив.
Код:
ba ab s
 0  0 0
 0  1 1
 1  0 2
 1  1 3
Из таблицы видно, как от флагов зависит выводимая строка (ее индекс).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить направление движения Monny Общие вопросы C/C++ 2 29.11.2012 15:51
Олимпиадная задача. Godziller Фриланс 6 28.05.2012 14:10
Олимпиадная задача Saidoz Паскаль, Turbo Pascal, PascalABC.NET 7 28.10.2011 13:02
Как отследить направление движения мыши? yourself Общие вопросы Delphi 8 30.05.2008 08:04
Олимпиадная задача Carbon Общие вопросы C/C++ 2 23.05.2007 22:07