Четвертая по счету игра на сайте называется Ragnarök — Power of Thor, где нам посчастливилось быть Великим Воином Тором. Тору необходимо самым кратчайшим путем добраться до источника энергии, которая придаст ему еще больше сил и уверенности в дальнейших сражениях.
Пока еще не всемогущий Тор ждет указаний
Инициализация
В начале нам сообщают положение на карте источника и самого персонажа (их координаты по X и Y) (int LX, LY) (int TX, TY) соответственно.
Игровой цикл
Бесконечно (до конца игры) повторяемый игровой цикл состоит из любого количества кода, который читает входной поток и выводит команду в выходной поток.
Вход
В самом игровом цикле нам сообщают величину энергии Тора (int E), которая уменьшается на 1 с каждым последующим ходом.
Выход
В выходной поток необходимо вывести одну строку. Нам представлено всего 8 возможных вариантов дальнейшего передвижения Тора.
Движение возможно только как показано на картинке (т.е. по компасу). Например, если мы хотим, чтобы персонаж двигался вправо (на восток) мы выведем буквочку E и т.д.
Перевод строки на новую обязателен.
Тест 1
Запуская программу впервые, Тор будет сам не свой, двигаясь совсем не по направлению к источнику.
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
|
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; /** * Auto-generated code below aims at helping you parse * the standard input according to the problem statement. **/ int main() { int LX; // the X position of the light of power int LY; // the Y position of the light of power int TX; // Thor's starting X position int TY; // Thor's starting Y position cin >> LX >> LY >> TX >> TY; cin.ignore(); // game loop while (1) { int E; // The level of Thor's remaining energy, representing the number of moves he can still make. cin >> E; cin.ignore(); // Write an action using cout. DON'T FORGET THE "<< endl" // To debug: cerr << "Debug messages..." << endl; cout << "SE" << endl; // A single line providing the move to be made: N NE E SE S SW W or NW } } |
Пройти первый и второй тесты, кажется просто, якобы написать в какую сторону мальчику бежать и только наблюдать за процессом, но не тут то было. Третий тест показывает нам, что все-таки придется подумать об адекватном решении.
Адекватное решение
Немного подумав вспоминаем, что нам даны начальные координаты как источника так и энергии. Сразу же приходит в голову мысль, что их надо сравнивать.
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 37 38 39 40 41 42 43 44 45 46 47 48
|
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <math.h> using namespace std; /** * Auto-generated code below aims at helping you parse * the standard input according to the problem statement. **/ int main() { int LX; // the X position of the light of power int LY; // the Y position of the light of power int TX; // Thor's starting X position int TY; // Thor's starting Y position cin >> LX >> LY >> TX >> TY; cin.ignore(); // game loop while (1) { int E; // The level of Thor's remaining energy, representing the number of moves he can still make. cin >> E; cin.ignore(); if (LX == TX) //Movement along the X axis. { if (( LY - TY ) < 0) { cout << "N" << endl; } else { cout << "S" << endl; } } if (TY == LY) //Movement along the Y axis. { if (( LX - TX ) < 0) { cout << "W" << endl; } else { cout << "E" << endl; } } } } |
Если равны координаты Тора и источника энергии по X, то тут мы находим разность координат источника и Тора по Y, если LY — TY > 0 (Источник находится выше Тора по оси Y), то идем на юг (вверх), в противном случае на север (вниз). Аналогично и с движением по Y, что дает нам силы пройти первые два теста.
Дважды заряженный энергией боец рвется подзарядиться и в третий раз, но вдруг остается стоять на месте. Обескураженный обстоятельствами Тор замечает, что источник уже находится не ровно по оси движения, а под каким-то определенным углом. Оставаясь на месте, Тор принимает обет молчания (не выводит ничего на экран) и погружается в свои мысли.
Цикл for идет на помощь
Конечно, мы могли бы высчитывать конечное число выводов команд на экран или подбивать все это проваливая тесты раз за разом. Но Тор нам подсказывает, что этого делать не надо, ведь он вспомнил могучее заклинание под названием цикл, которое спасает в очень многих ситуациях и эта не исключение.
Код на C++:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <math.h> using namespace std; /** * Auto-generated code below aims at helping you parse * the standard input according to the problem statement. **/ int main() { int LX; // the X position of the light of power int LY; // the Y position of the light of power int TX; // Thor's starting X position int TY; // Thor's starting Y position cin >> LX >> LY >> TX >> TY; cin.ignore(); // game loop while (1) { int E; // The level of Thor's remaining energy, representing the number of moves he can still make. cin >> E; cin.ignore(); if (LX == TX) //Movement along the X axis. { if (( LY - TY ) < 0) { cout << "N" << endl; } else { cout << "S" << endl; } } if (TY == LY) //Movement along the Y axis. { if (( LX - TX ) < 0) { cout << "W" << endl; } else { cout << "E" << endl; } } if (( LX - TX ) > 0) //Movement to the left half of the map { if (( LY - TY ) < 0) { for(int i = 0;i < abs ( LY - TY );i++) { cout << "NE" << endl; } for (int i = 0;i < abs ( LX - abs ( LY - TY ));i++) { cout << "E" << endl; } } else { if (( LY - TY ) > 0) { for(int i = 0;i < abs ( LY - TY );i++) { cout << "SE" << endl; } for (int i = 0;i < abs ( LX - abs ( LY - TY ));i++) { cout << "E" << endl; } } } } if (( LX - TX ) < 0) //Movement to the right half of the map { if (( LY - TY ) < 0) { for(int i = 0;i < abs ( LY - TY );i++) { cout << "NW" << endl; } for (int i=0;i < abs ( TX - ( LY - TY ));i++) { cout << "W" << endl; } } else { if (( LY - TY ) > 0) { for (int i = 0;i < abs ( LY - TY );i++) { cout << "SW" << endl; } for (int i = 0;i< abs ( TX - ( LY - TY ));i++) { cout << "W" << endl; } } } } } } |
Код на Java:
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
import java.util.*; import java.io.*; import java.math.*; class Player { public static void main(String args[]) { Scanner in = new Scanner(System.in); int lightX = in.nextInt(); // the X position of the light of power int lightY = in.nextInt(); // the Y position of the light of power int initialTX = in.nextInt(); // Thor's starting X position int initialTY = in.nextInt(); // Thor's starting Y position // game loop while (true) { int remainingTurns = in.nextInt();// The remaining amount of turns Thor can move. Do not remove this line. if (lightX == initialTX) //Movement along the X axis. { if ((lightY - initialTY) < 0) System.out.println("N"); else System.out.println("S"); } if (initialTY == lightY) //Movement along the Y axis. { if ((lightX - initialTX) < 0) System.out.println("W"); else System.out.println("E"); } if ((lightX - initialTX) > 0) //Movement to the left half of the map { if ((lightY - initialTY) < 0) { for(int i = 0;i < Math.abs(lightY - initialTY);i++) System.out.println("NE"); for (int i = 0;i < Math.abs(lightX - Math.abs(lightY - initialTY));i++) System.out.println("E"); } else { if ((lightY - initialTY) > 0) { for(int i = 0;i < Math.abs(lightY - initialTY);i++) System.out.println("SE"); for (int i = 0;i < Math.abs(lightX - Math.abs(lightY - initialTY));i++) System.out.println("E"); } } } if ((lightX - initialTX) < 0) //Movement to the right half of the map { if ((lightY - initialTY) < 0) { for(int i = 0;i < Math.abs(lightY - initialTY);i++) System.out.println("NW"); for (int i=0;i < Math.abs(initialTX - (lightY - initialTY));i++) System.out.println("W"); } else { if ((lightY - initialTY) > 0) { for(int i = 0;i < Math.abs(lightY - initialTY);i++) System.out.println("SW"); for (int i=0;i < Math.abs(initialTX - (lightY - initialTY));i++) System.out.println("W"); } } } } } } |
Получается вот такой вот симпатичный код, описывающий все возможные ситуации по передвижению Тора (переносит Тора к источнику из любой точки карты). Разбивая на два возможных случая, движение в правой половине карты и в левой половине карты, получается, что программа охватывает любую ее точку. В самом цикле возьмем модуль между разностью (т.к. источник может находиться и ниже Тора). Сравниваем LX и TX, для того, чтобы узнать в какой половине карты находится источник. Если LX — TX > 0, то в цикле будем отнимать от LX, в противном случае — от TX, дабы не получить отрицательные значения. В конечном счете переменная E (энергия) там так и не понадобилось, так как воин и так находил кратчайшее расстояние.
Пройдя все тесты, наш довольный рыцарь полон сил и энергии. Пожелаем удачи ему в дальнейших приключениях.
Related Images:
Понравилось это:
Нравится Загрузка...
Похожее
Зачёл, конечно. Очень хорошо получилось!
По последнему коду есть небольшое замечание. Думаю его можно значительно сократить если выводите не сразу, например, «NE»., а сначала «N» и потом возможно «E». Т.е. проверяем нужно ли двигаться по вертикали и выводим (или нет) соответствующую букву N или S. Потом проверяем нужно ли двигаться по горизонтали и добавляем (или нет) соответствующую букву S или W. И только потом выводим конец строки. Т.е. мы не перемножаем комбинации (3 х 3 = 9), а складываем (3 + 3 = 6). Скорее всего это сработает и сократит код на треть.
Да, и не нужно указывать х, у в качестве меток. Никто по таким ключевым словам искать не станет.
Почему снова поставили на проверку?
Была добавлена Java-версия программы в спойлере с названием «Цикл for идет на помощь»