Advertisement
FaresX

Untitled

Jan 11th, 2017
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>
  4. #include <cctype>
  5.  
  6.  
  7. typedef unsigned short int UShort;
  8. typedef const UShort CUShort;
  9. typedef std::string Str;
  10. typedef const Str CStr;
  11.  
  12.  
  13. bool IsFalling(const std::vector<UShort>& abysses, CUShort currRI)
  14. {
  15.     for (UShort i = 0; i < abysses.size(); ++i)
  16.         if (abysses[i] == currRI) return true;
  17. }
  18.  
  19.  
  20. void ExtractCommand(Str& currCommand)
  21. {
  22.     switch (currCommand[0])
  23.     {
  24.         case 'u': currCommand = "up"; break;
  25.         case 'd': currCommand = "down"; break;
  26.         case 'f': currCommand = "forward"; break;
  27.         case 'b': currCommand = "backward"; break;
  28.         case 'l': currCommand = "left"; break;
  29.         case 'r': currCommand = "right"; break;
  30.         default: currCommand = "end"; break;
  31.     }
  32. }
  33.  
  34.  
  35. void ExtractNumberOfSteps(CStr& currCommand, UShort& steps)
  36. {
  37.     std::string numVal = "";
  38.  
  39.     for (UShort i = 0; i < currCommand.length(); ++i)
  40.     {
  41.         if (isdigit(currCommand[i]))
  42.             numVal += currCommand[i];
  43.     }
  44.  
  45.     std::stringstream tempVal(numVal);
  46.     tempVal >> steps;
  47. }
  48.  
  49.  
  50. void HandleSnakeMovement(const std::vector<UShort>& abysses, CUShort cubeSize, UShort& currLI, UShort& currRI, Str& snakeStatus, CStr& currCommand)
  51. {
  52.     CStr snakeIsDead = "dead";
  53.     CUShort lastAbyss = abysses.back();
  54.  
  55.     if (currCommand == "up")
  56.     {
  57.         if (currRI <= cubeSize - 1) snakeStatus = snakeIsDead;
  58.         else currRI -= (cubeSize + 3);
  59.     }
  60.  
  61.     else if (currCommand == "down")
  62.     {
  63.         if (currRI >= lastAbyss) snakeStatus = snakeIsDead;
  64.         else currRI += (cubeSize + 3);
  65.     }
  66.  
  67.     else if (currCommand == "forward")
  68.     {
  69.         if (currLI == 0) snakeStatus = snakeIsDead;
  70.         else currLI--;
  71.     }
  72.  
  73.     else if (currCommand == "backward")
  74.     {
  75.         if (currLI == cubeSize - 1) snakeStatus = snakeIsDead;
  76.         else currLI++;
  77.     }
  78.  
  79.     else if (currCommand == "left")
  80.     {
  81.         if (currRI == 0) snakeStatus = snakeIsDead;
  82.  
  83.         else
  84.         {
  85.             currRI--;
  86.             if (IsFalling(abysses, currRI)) snakeStatus = snakeIsDead;
  87.         }
  88.     }
  89.  
  90.     else
  91.     {
  92.         currRI++;
  93.         if (currRI > lastAbyss + cubeSize || IsFalling(abysses, currRI)) snakeStatus = snakeIsDead;
  94.     }
  95.  
  96. }
  97.  
  98.  
  99. int main()
  100. {
  101.     UShort cubeSize;
  102.     std::cin >> cubeSize;
  103.     CUShort cubeFencesPerRow = cubeSize - 1;
  104.     CUShort cubeAbyssesPerRow = cubeFencesPerRow << 1;
  105.     CUShort cubeRows = cubeSize;
  106.     CUShort cubeCols = (cubeSize * cubeSize) + cubeFencesPerRow + cubeAbyssesPerRow;
  107.     char cubeFields[cubeRows][cubeCols];
  108.     const char snakeBirthPoint = 's', apple = 'a', delimeter = '|';
  109.     UShort currLI, currRI;
  110.     Str snakeStatus;
  111.     CStr snakeIsAlive = "alive", snakeIsDead = "dead";
  112.     std::vector<UShort> abysses;
  113.  
  114.     std::cin.sync();
  115.  
  116.     for (UShort r = 0; r < cubeSize; ++r)
  117.     {
  118.         Str singleCubeField;
  119.         std::getline(std::cin, singleCubeField);
  120.  
  121.         for (UShort c = 0, s = 0; c < cubeCols && s < singleCubeField.length(); ++c, ++s)
  122.         {
  123.             cubeFields[r][c] = singleCubeField[s];
  124.  
  125.             if (singleCubeField[s] == snakeBirthPoint)
  126.             {
  127.                 currLI = r;
  128.                 currRI = c;
  129.                 snakeStatus = snakeIsAlive;
  130.             }
  131.         }
  132.     }
  133.  
  134.      for (UShort c = 0; c < cubeCols; ++c)
  135.         if (cubeFields[0][c] == delimeter)
  136.         {
  137.             abysses.push_back(c - 1);
  138.             abysses.push_back(c + 1);
  139.         }
  140.  
  141.     UShort applesEatenBySnake = 0, numOfCommands = 0;
  142.     CUShort commandsLimit = 100;
  143.  
  144.     static Str prevCommand;
  145.     std::cin.sync();
  146.     std::cin >> prevCommand;
  147.  
  148.     while (snakeStatus != snakeIsDead && numOfCommands <= commandsLimit)
  149.     {
  150.         std::cin.sync();
  151.         Str currCommand;
  152.         std::getline(std::cin, currCommand);
  153.         numOfCommands++;
  154.         UShort steps;
  155.  
  156.         ExtractNumberOfSteps(currCommand, steps);
  157.         ExtractCommand(currCommand);
  158.  
  159.         for (UShort repeatCommand = 0; repeatCommand < steps; ++repeatCommand)
  160.         {
  161.             HandleSnakeMovement(abysses, cubeSize, currLI, currRI, snakeStatus, prevCommand);
  162.             if (cubeFields[currLI][currRI] == apple) applesEatenBySnake++;
  163.         }
  164.  
  165.         if (currCommand == "end")
  166.         {
  167.             std::cout << '\n';
  168.             break;
  169.         }
  170.  
  171.         prevCommand = currCommand;
  172.     }
  173.  
  174.     std::cout << "Points collected: " << applesEatenBySnake << '\n';
  175.     if (snakeStatus == snakeIsDead) std::cout << "The snake dies.";
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement