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.
Типичная задача про движения на плоскости (Pascal)
Текст задачи:
Робот ползает по плоскости, оставляя за собой тонкий след краски. Движение робота описывается его программой – строкой из команд N, W, S, E. По команде N робот проползает один метр в северном направлении, по команде W – один метр в западном направлении, S – один метр южном направлении, E – один метр в восточном направлении.
Программа составлена так, что путь робота начинается и заканчивается в одной точке; кроме неё, ни в одной другой точке плоскости робот не бывает больше одного раза.
Необходимо найти площадь участка, границей которого служит след Суперслизня после завершения роботом программы.
Входные данные:
Входной файл содержит программу робота – последовательность из символов N, W, S, E без пробелов. Максимальная длина программы – 10000 команд.
Выходные данные:
Выходной файл должен содержать площадь участка в квадратных метрах.
Пример
Входной файл input.txt:
SSWNNE
Выходной файл output.txt:
2
"просторочно" пройтись по траектории, получая разности правой и левой границы
Цитата: Михаил
"просторочно" пройтись по траектории, получая разности правой и левой границы
Гхм, это как?
у робота минимальный шаг 1 метр, следовательно минимальная высота вериткальной линии 1 метр, разбиваешь всю ограниченную область на строки высотой 1 метр, в каждой строке находишь координаты левой и правой границы, их разность и будет площадь данной строки в метрах^2
задача кстати достаточно любопытная(спасибо автору)
вот какая идея у меня получилась я иду не построчно а по периметру
(паскаль помню плохо и компилятора нет под рукой но алгоритм вроде адекватный)
Код:
надеюсь нигде не наврал :)
nilbog и Михаил, огромное спасибо! Выручили))))