Case11. Локатор ориентирован на одну из сторон света («С» — север, «З» — запад, «Ю» — юг, «В» — восток) и может принимать три цифровые команды поворота: 1 — поворот налево, –1 — поворот направо, 2 — поворот на $$180^o$$. Дан символ $$C$$ — исходная ориентация локатора и целые числа $$N_1$$ и $$N_2$$ — две посланные команды. Вывести ориентацию локатора после выполнения этих команд.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
program Case11; var C:Char; N1,N2:Integer; begin Write('Введите текущее напрление перемещения робота: '); Readln(C); Write('Введите 1 команду: '); Readln(N1); Write('Введите 2 команду: '); Readln(N2); Case C of 'N':Case N1+N2 of -1,3:C:='E'; 1:C:='W'; 2,-2:C:='S'; end; 'E':Case N1+N2 of -1,3:C:='S'; 1:C:='N'; 2,-2:C:='W'; end; 'S':Case N1+N2 of -1,3:C:='W'; 1:C:='E'; 2,-2:C:='N'; end; 'W':Case N1+N2 of -1,3:C:='N'; 1:C:='S'; 2,-2:C:='E'; end; end; Writeln(C); end. |
* Обозначение были взяты английские обозначения сторон света, т.к. при вводе с консоли всё плохо с кирилицей. Север — N Запад-W Юг-S Восток-E
Другие задачи из раздела Case можно посмотреть здесь.
Ещё должен быть 0 (-1,-1), тогда локатор повернётся в изначальную сторону
-1 1 точнее
Да, на это моего опыта управления локаторами не хватило. 🙂
Поправил.
Я прошу прощения, но как N1+N2 может = -3?
даа… в общем то ни как…
Ещё убрал варианты с 0,4:C:=… так как они сводятся к тому, что ничего делать не надо… ну и не будем ничего делать.
Ещё была ошибка при начальном положении ‘E’: тоже поправил…
Как то у меня не заладилось с Локатором ссамого начала 🙂
Ну там только три варианта N1+N2: 0; 3; и 1.
N1 и N2 сами по себе могут принимать значения 1; -1; 2. А выражение N1+N2 может принимать значения 0; 3; 1.
Недосчитал, сори. Еще могут быть такие N1+N2: 1+1=2; -1+(-1)=-2; и 2+2=4. Итого такие случаи:
a. 2; -2 на 180 градусов;
b. 0; 4 на 360 градусов;
c. 1 на 90 градусов влево;
d. 3 на 90 градусов вправо.
Как то так получается
думал-думал, как обернуть внутренние кейсы в цикл, плюнул и сделал без кейсов =)
Блин прям взрыв мозга…
l += l; это в итоге получается массив строковых значений? из 8 элементов ‘north’, ‘west’, ‘south’, ‘east’, ‘north’, ‘west’, ‘south’, ‘east’ ? и потом мы должны найти наше начальное положение? if c = l[i] then ?
может тогда while (c <> l[i] or i=l.Count) i:=i+1;
а поcле цикла:
writeFormat(‘ориентация локатора: {0}’,l[i + abs(n1 + n2)]);
извените меня торащит от PascalABC.NET меня глючит что это C почему то 🙂
Да, с while-ом оно как-то красивше будет =)
А так то достаточно проверить первые четыре элемента списка (массива). Вторая часть повторяется, чтоб не было выхода за границы в l[i + abs(n1 + n2)]. Наверное можно было написать циклический список…
Говорят это С# для школьников. На мехмате в ЮФУ на первом курсе преподавался. Сейчас вроде уже на C# перешли они там. Но для таких задачек просто великолепный язык.