На
ищем клад — 1
мы находимся на острове, на котором закопан клад. мы находимся в точке с координатами (0, 0) и смотрим на север. нам известно, где закопан клад, но этого мало: остров полон опасностей, и нужно перемещаться строго по указаниям карты, которая, к счастью, тоже имеется в нашем распоряжении. мы хотим найти клад как можно скорее.
известны координаты клада и указания, которым нужно следовать, чтобы его найти. каждое указание карты состоит из одного слова и, возможно, одного натурального числа. слово — одно из набора: «вперёд», «налево», «направо», «разворот» или «стоп».
после слова «вперёд» следует количество шагов, которое следует пройти в том направлении, куда мы в данный момент смотрим. слова «налево» или «направо» означают, что нужно изменить направление взгляда под прямым углом, «разворот» — что прямо на обратное. команда «стоп» означает остановку.
найдите минимальное количество указаний карты, которое нужно выполнить, чтобы прийти к кладу.
формат ввода
сначала вводятся два числа на отдельных строчках: координаты клада по оси икс (запад-восток) и игрек (юг-север).
затем следует некоторое количество указаний карты. каждое указание карты состоит из одного слова и, возможно, одного натурального числа на отдельной строке. слово — одно из набора: «вперёд», «налево», «направо», «разворот» или «стоп».
формат вывода
программа выводит на отдельных строках минимальное количество указаний карты, которое нужно выполнить, чтобы прийти к кладу, и направление взгляда в этот момент (одно из: «север», «юг», «запад», «восток»). гарантируется, что карта приводит к кладу.
пример 1
ввод вывод
-2
9
вперёд
9
налево
вперёд
2
разворот
вперёд
17
стоп
3
запад
#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "locale.h"
using namespace std;
int main()
{
int x;
cin >> x;
int a = x;
x = (x & 0x55) << 1 | (x & 0xAA) >> 1;
x = (x & 0x33) << 2 | (x & 0xCC) >> 2;
x = (x & 0x0F) << 4 | (x & 0xF0) >> 4;
int s, k;
k = 1;
s = 0;
while (x > 0)
{
s += k*(x % 2);
k *= 10;
x /= 2;
}
int p, o;
p = 1;
o = 0;
while (a > 0)
{
o += p*(a % 2);
p *= 10;
a /= 2;
}
cout << o;
cout << "\n" << s;
getchar();
getchar();
return 0;
}
получает случайное целое типа int, выводит его двоичное представление на экран,
Изменить порядок следования битов в числе на обратный
"Современное решение"
// PascalABC.NET 3.0, сборка 1076
begin
var n:=ReadInteger('Количество элементов в массиве: ');
var x:=ArrRandom(n,-20,20);
Writeln('Массив Х'); x.Println;
Write('Ср. арифм. отрицательных элементов после первого, большего 10: ');
var a1:=x.SkipWhile(x->x<=10).Where(x->x<0);
if a1.Count=0 then Writeln('пусто')
else Writeln(a1.Average);
Write('Ср. арифм. всех элементов до первого, большего 10: ');
a1:=x.TakeWhile(x->x<=10);
if a1.Count=0 then Writeln('пусто')
else Writeln(a1.Average)
end.
Тестовые просчеты:
Количество элементов в массиве: 15
Массив Х
-11 11 16 -7 11 -8 10 -16 15 -15 -10 -8 -6 -13 -17
Ср. арифм. отрицательных элементов после первого, большего 10: -11.1111111111111
Ср. арифм. всех элементов до первого, большего 10: -11
Количество элементов в массиве: 13
Массив Х
14 -9 1 2 12 -15 0 16 -19 16 -11 -15 -12
Ср. арифм. отрицательных элементов после первого, большего 10: -13.5
Ср. арифм. всех элементов до первого, большего 10: пусто
Количество элементов в массиве: 5
Массив Х
-11 2 0 15 7
Ср. арифм. отрицательных элементов после первого, большего 10: пусто
Ср. арифм. всех элементов до первого, большего 10: -3
Количество элементов в массиве: 3
Массив Х
15 10 8
Ср. арифм. отрицательных элементов после первого, большего 10: пусто
Ср. арифм. всех элементов до первого, большего 10: пусто
"Школьный вариант решения"
// PascalABC.NET 3.0, сборка 1076
const
nmax=50; { максимальное кол-во элементов }
var
i,n,p,s1,s2,k2:integer;
x:array[1..nmax] of integer;
begin
Write('Количество элементов в массиве: '); Read(n);
Randomize;
Writeln('Массив Х');
p:=0;
for i:=1 to n do begin
x[i]:=Random(41)-20;
Write(x[i],' ');
if p=0 then
if x[i]>10 then p:=i;
end;
Writeln;
Write('Ср. арифм. отрицательных элементов после первого, большего 10: ');
if p=0 then Writeln('пусто')
else begin
s2:=0; k2:=0;
for i:=p+1 to n do
if x[i]<0 then begin s2:=s2+x[i]; Inc(k2) end;
if k2=0 then Writeln('пусто')
else Writeln(s2/k2)
end;
Write('Ср. арифм. всех элементов до первого, большего 10: ');
if p=0 then Writeln('пусто')
else begin
s1:=0;
for i:=1 to p-1 do s1:=s1+x[i];
Writeln(s1/(p-1))
end
end.
Этот вариант существенно длиннее, но главное, что нужно долго вглядываться в текст программы, чтобы понять, что именно она делает.