Найти клад
Найти закопанный пиратами клад просто: все, что для этого нужно, это карта. Как известно, пираты обычно рисуют карты от руки и описывают алгоритм нахождения клада так: «Встаньте около одинокой пальмы. Пройдите тридцать шагов в сторону леса, потом семнадцать шагов в сторону озера, ..., наконец десять шагов в сторону большого булыжника. Клад находится под ним». Большая часть таких указаний просто сводится к прохождению какого-то количества шагов в одном из восьми направлений:
1 — север,
2 — северо-восток,
3 — восток,
4 — юго-восток,
5 — юг,
6 — юго-запад,
7 — запад,
8 — северо-запад.
Длина шага в любом направлении равна 1.
Путешествие по такому пути обычно является прекрасным способом посмотреть окрестности, однако в наше время постоянной спешки ни у кого нет времени на это. Поэтому кладоискатели хотят идти напрямую в точку, где зарыт клад. Например, вместо того чтобы проходить три шага на север, один шаг на восток, один шаг на север, три шага на восток, два шага на юг и один шаг на запад, можно пройти напрямую примерно 3,6 шага.
Вам необходимо написать программу, которая по указаниям пиратов
определяет точку, где зарыт клад.

Формат входных данных
Первая строка входного файла содержит число N — число указаний (1 < N<40). Последующие N строк содержат сами указания – номер направления (целое число от 1 до 8) и количество шагов (целое число от 1 до 1000). Числа разделены пробелами.

Формат выходных данных В выходной файл выведите координаты X и Y точки (два вещественных числа, разделенные пробелом), где зарыт клад, считая, что ось Ox направлена на восток, а ось Oy — на север. Изначально кладоискатель должен стоять в начале координат. Координаты необходимо вывести с погрешностью не более 10−3.

Для решения этой задачи достаточно было завести две переменные для хранения текущих координат кладоискателя и изменять их в соответствии с входными данными. Например, можно было для каждого указания разбирать 8 случаев — в зависимости от направления — и в каждом из них соответствующим образом передвигать кладоискателя. Однако при таком решении довольно легко ошибиться. Более рациональным было бы использование того факта, что 8 направлений пронумерованы подряд по часовой стрелке. Это приводит, например, вот к такому короткому решению:

Var I,N,Dir,Len:LongInt;
X,Y:Real;
Begin
Assign(Input,’c.in’);
Reset(Input);
Read(N); X := 0; Y := 0;
For I := 1 To N Do Begin
Read(Dir,Len);
X := X + Sin(Pi/4*(Dir-1))*Len;
Y := Y + Cos(Pi/4*(Dir-1))*Len
End;
Assign(Output,’c.out’);
Rewrite(Output);
WriteLn(X:0:3,’ ’,Y:0:3);
Close(Output)
End.
This site was made on Tilda — a website builder that helps to create a website without any code
Create a website