Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Типичная задача про движения на плоскости (Pascal)

10K
15 сентября 2007 года
ost-andrew
19 / / 24.01.2006
Очень часто встречал подобные задачи, только они ограничивались тем, что нужно было найти либо длину всего пути, либо сам кратчайший путь до какой-либо точки. В данном случае требуется найти площадь, что меня ввело в легкий ступор...

Текст задачи:
Робот ползает по плоскости, оставляя за собой тонкий след краски. Движение робота описывается его программой – строкой из команд N, W, S, E. По команде N робот проползает один метр в северном направлении, по команде W – один метр в западном направлении, S – один метр южном направлении, E – один метр в восточном направлении.

Программа составлена так, что путь робота начинается и заканчивается в одной точке; кроме неё, ни в одной другой точке плоскости робот не бывает больше одного раза.

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

Входные данные:

Входной файл содержит программу робота – последовательность из символов N, W, S, E без пробелов. Максимальная длина программы – 10000 команд.

Выходные данные:

Выходной файл должен содержать площадь участка в квадратных метрах.

Пример
Входной файл input.txt:
SSWNNE

Выходной файл output.txt:
2
268
15 сентября 2007 года
Михаил
587 / / 25.06.2005
"просторочно" пройтись по траектории, получая разности правой и левой границы
10K
15 сентября 2007 года
ost-andrew
19 / / 24.01.2006
Цитата: Михаил
"просторочно" пройтись по траектории, получая разности правой и левой границы


Гхм, это как?

268
15 сентября 2007 года
Михаил
587 / / 25.06.2005
у робота минимальный шаг 1 метр, следовательно минимальная высота вериткальной линии 1 метр, разбиваешь всю ограниченную область на строки высотой 1 метр, в каждой строке находишь координаты левой и правой границы, их разность и будет площадь данной строки в метрах^2
622
15 сентября 2007 года
nilbog
507 / / 19.12.2006
Михаил - такая идея судя по всему потребует хранения траектории структурировано что бы можно было пройтись построчно
задача кстати достаточно любопытная(спасибо автору)
вот какая идея у меня получилась я иду не построчно а по периметру
(паскаль помню плохо и компилятора нет под рукой но алгоритм вроде адекватный)
Код:
var s:string; sum,i,x,y:integer;
begin
readln(s);{для простоты восприятия сделал ввод строки исходных данных с клавиатуры в стандартный тип string}
{для определенности считаю что строка начинается с 'e' или 'w'
это неограничивает ничего - мы всегда можем это получить циклическим сдвигом строки}
i:=1; x:=0;y:=0;sum:=0;
while (i<=length(s)) do
  case s of
  'e':while (i<=length(s)) and (s='e') do
        begin i:=i+1; x:=x+1 end;
  'w':while (i<=length(s)) and (s='w') do
        begin i:=i+1; x:=x-1 end;
  's': begin
       while (i<=length(s)) and (s='s') do
         begin i:=i+1; y:=y-1 end;
       sum:=sum+x*y; y:=0
       end;
 'n': begin
       while (i<=length(s)) and (s='n') do
         begin i:=i+1; y:=y+1 end;
       sum:=sum+x*y; y:=0
       end;
 end;
sum:=abs(sum); {если фигура лежит ниже начала точки отсчета то сумма обхода может получится отрицательной}
writeln(sum)
end.

надеюсь нигде не наврал :)
10K
16 сентября 2007 года
ost-andrew
19 / / 24.01.2006
nilbog и Михаил, огромное спасибо! Выручили))))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог