Advertisement
fabis_sparks

LonelyKing FinalRelease

Oct 16th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.44 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <time.h>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <cstring>
  7.  
  8. #define cout std::cout
  9. #define endl std::endl
  10. #define cin std::cin
  11.  
  12. int N; // Кол-во ходов. Задаём в main
  13.  
  14. void random_moves(int); // При выборе случайных перемещений
  15. void manual_moves(int); // С вводом перемещений вручную
  16. void KingMove(int, int); // Функция для перемещений короля по полю
  17. void answer_check(char[]); // Проверка правильности ввода ответа
  18. void checking(); // Поиск клеток, на которые король встал два раза
  19. void checking_true(int, int); // Вывод ответа
  20. void N_check(int);
  21.  
  22. struct coordinates { // Запись координат, где был король
  23.     int x;
  24.     int y;
  25. };
  26. struct Moves {
  27.     Moves() {
  28.         Head = NULL; //Обозначили в конструкторе что голова пустая, ибо очередь пуста
  29.     }
  30.     int val;
  31.     int size;
  32.     Moves *Head, *Tail, *Next;
  33.     void Add(const int x);
  34.     void Show();
  35.     void Del();
  36. };
  37.  
  38. void Moves::Add(int x) {
  39.     static int count = 0;
  40.     /////////////////////////////////////////////
  41.     Moves *temp = new Moves;
  42.     Next = temp->Head;
  43.     temp->val = x;
  44.     if (Head != NULL) {
  45.         Tail->Next = temp;
  46.         Tail = temp;
  47.     }
  48.     else Head = Tail = temp;
  49.     ////////////////////////////////////////////
  50.     count++;
  51.     size = count;
  52.  
  53. }
  54.  
  55. void Moves::Show() {
  56.     Moves *temp = Head;  //Получаем адрес начала очереди
  57.     int count = 1;
  58.     while (temp != Tail->Next) {            //Пока адрес указателя не совпадет со следующим элементом за хвостом очереди
  59.         cout <<  endl << "Шаг №: " << count-1 << endl;
  60.         cout << "Действие №: " << temp->val << "   "  << "\n";       //Будем выбирать элементы, использя указатель temp
  61.         KingMove(temp->val, count); //Передаём в функцию значение и счетчик для координат
  62.         count++;
  63.         temp = temp->Next;             //Как только выбрали элемент, переходим по новому адресу к следующему элементу
  64.  
  65.     }
  66. }
  67.  
  68. void Moves::Del() {
  69.  
  70.     Moves *temp = new Moves;
  71.     int count = 0;
  72.  
  73.     while (temp != Tail) {
  74.         temp = Head;//Нашли текущее начало очереди и запомнили адрес в сторонюю переменую
  75.         Head = Head->Next; //Сместили фактическое начало на адрес следующего поступившего элемента
  76.         cout << "Udalena swiaz s:  " << temp->val << "\n";  //Для наглядности
  77.         delete temp;  //Очистили связь
  78.     }
  79. }
  80. coordinates* coord = new coordinates[N]; // Выделим память под массив структур с координатами перемещения
  81.  
  82. int main()
  83. {
  84.     Moves mv;  //Объявили переменную типа нашей очереди FIFO (имя структуры)
  85.     mv.Head = NULL;  //Обозначили что голова пустая, ибо очередь пуста (можно в конструкторе)
  86.     setlocale(LC_ALL, "Russian");
  87.     cout << "Введите кол-во ходов: ";
  88.     //cin >> N; // Ввод количества перемещений
  89.     while (!(cin >> N)) // проверка ввода с клавиатуры
  90.     {
  91.         cin.clear();
  92.         while (cin.get() != '\n');
  93.         cout << "Неверный ввод. Повторите." << endl;
  94.         cout << "Введите колличество эллементов:";
  95.     }
  96.  
  97.     N_check(N);
  98.     for (int i = 0;i < N + 1;i++) {
  99.         coord[i].x = 0;
  100.         coord[i].y = 0;
  101.     }
  102.     char *answer = new char[4];
  103.     cout << endl << "Изначально Король находится в координах (0;0). И поскольку поле бесконечное, то может двигаться в любом из направлений." << endl << "Будете ли Вы заполнять список случайными ходами? (yes/no) ";
  104.     cin >> answer;
  105.     answer_check(answer); // Проверим верность введенного ответа
  106.     checking(); //Выведем ответ
  107.     system("pause");
  108.     return 0;
  109. }
  110.  
  111. void random_moves(int nmoves) {
  112.     Moves mv;
  113.     srand(time(NULL));
  114.     cout << "Сделаем случайные ходы...";
  115.     int action;
  116.     for (int i = 0;i < nmoves;i++) {
  117.         action = rand() % 7 + 0;
  118.         mv.Add(action);
  119.     }
  120.     mv.Show(); //Покажем наши команды
  121.     system("pause");
  122. }
  123.  
  124. void manual_moves(int nmoves) {
  125.     Moves mv;
  126.     cout << endl << "0 - Верх" << endl << "1 - Вниз" << endl << "2 - Влево" << endl << "3 - Вправо" << endl << "4 - Вверх-вправо" << endl << "5 - Вниз-вправо" << endl << "6 - Вниз-влево" << endl << "7 - Вверх-влево" << endl;
  127.     int action;
  128.     for (int i = 0;i < nmoves;i++) { // Вводим команды перемещения и сразу проверяем на наличие данной команды
  129.         cin >> action;
  130.         if (action > 7 || action < 0) { cout << "Не существует такого действия. Введите еще раз:"; }
  131.         while (action > 7 || action < 0) { cin >> action; }
  132.         mv.Add(action); // Помещаем команды в очереди FIFO
  133.     }
  134.     mv.Show(); //Покажем наши команды
  135.     system("pause");
  136. }
  137.  
  138. void KingMove(int move, int count) { // Перемещаем короля согласно командам
  139.     coord[count].x += coord[count - 1].x;
  140.     coord[count].y += coord[count - 1].y;
  141.     if (move == 0) { coord[count].y++; }
  142.     if (move == 1) { coord[count].y--; }
  143.     if (move == 2) { coord[count].x--; }
  144.     if (move == 3) { coord[count].x++; }
  145.     if (move == 4) { coord[count].x++; coord[count].y++; }
  146.     if (move == 5) { coord[count].x++; coord[count].y--; }
  147.     if (move == 6) { coord[count].x--; coord[count].y--; }
  148.     if (move == 7) { coord[count].x--; coord[count].y++; }
  149.  
  150.     cout << "X: " << coord[count].x << "\t" << "Y: " << coord[count].y << "\n" << "================" << endl; // Вывод новых координат короля
  151. }
  152.  
  153. void answer_check(char answer[]) {
  154.     char quest1[] = "yes";
  155.     char quest2[] = "no";
  156.     if (strcmp(quest1, answer) == 0) {
  157.         random_moves(N);
  158.     }
  159.     else if (strcmp(quest2, answer) == 0) {
  160.         manual_moves(N);
  161.     }
  162.     else {
  163.         cout << "Неверный ответ. Введите 'yes' или 'no': " << endl;
  164.         cin >> answer;
  165.         answer_check(answer);
  166.     }
  167. }
  168. void N_check(int num) { // Для того, чтобы не запускать наш алгоритм для проверки простейших значений выведем ответ сразу и завершим программу
  169.  
  170.     if (num < 0) { cout << "Количество шагов не может быть отрицательным"; system("pause"); system("exit(0)"); };
  171.     if (num == 0) { cout << "Король остался на месте."; system("pause"); system("exit(0)"); }
  172.     if (num == 1) { cout << "Король не вставал два раза на одну и ту же клетку."; system("pause"); system("exit(0)"); }
  173.  
  174. }
  175.  
  176. void checking() {
  177.  
  178.     int i,j, smallest_diff=1000, smallest_i=0, smallest_j=0; // smallest_diff=1000, даже при кол-ве шагов больше 100к будет меньший ответ
  179.     for (i = 1;i < N + 1;i++) {
  180.         for (j = 1;j < N + 1;j++) {
  181.             if ((coord[i].x == coord[j].x) && (coord[i].y == coord[j].y) && (i != j)) { // Алгоритм для проверки кратчайшего кол-ва шагов и близости к началу очереди
  182.                 if ((abs(i - j) < smallest_diff) && (smallest_i < i || smallest_j < j)) { smallest_diff = abs(i - j); smallest_i = i; smallest_j = j; }
  183.                 }
  184.         }
  185.     }
  186.     checking_true(smallest_i, smallest_j);
  187. }
  188.  
  189. void checking_true(int x_true, int y_true) {
  190.     if (x_true != 0 && y_true != 0) {
  191.         cout << "Король встал на клетку, на которой был раньше." << endl;
  192.         cout << "Король был на одинаковой клетке на " << (x_true-1) << " шаге и на " << (y_true-1) << " шаге.";
  193.         system("pause");
  194.         system("exit(0)");
  195.     }
  196.     else {
  197.         cout << "Король не вставал два раза на одну и ту же клетку." << endl;
  198.         system("pause");
  199.         system("exit(0)");
  200.     }
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement