Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <string>
  5. #include <bitset>
  6. #include <vector>
  7. #include <list>
  8. #include <set>
  9. #include <map>
  10. #include <algorithm>
  11. #include <memory>
  12. #include <iterator>
  13. #include <functional>
  14.  
  15. using namespace std;
  16.  
  17. struct Pos
  18. {
  19.     int l;
  20.     int c;
  21. };
  22.  
  23. bool operator==(const Pos& p1, const Pos& p2)
  24. {
  25.     return p1.l == p2.l && p1.c == p2.c;
  26. }
  27.  
  28. int n;
  29. int m;
  30. Pos s;
  31. std::vector<Pos> o; /// obstacles
  32. std::vector<Pos> c; /// coins
  33. std::vector<std::pair<Pos, Pos>> p; /// portal
  34.  
  35. void f(int d)
  36. {
  37.     static int coins = 0, isOver = 0, playerEnteredInCyclicPortals = 0, i, j, noObstacleTaken = 0, total = 0;
  38.     char mat[n + 1][m + 1];
  39.     static map<pair<int, int>, int> isTaken, isObstacle, isPortal;
  40.     map<pair<int,int>, vector<pair<int, int> >> adj;
  41.     pair<int, int> tp_pos;
  42.     int obstacleEncountered = 0, isInPortal = 0;
  43.     for (int i = 1; i <= n; ++i) {
  44.         for (int j = 1; j <= m; ++j) {
  45.             mat[i][j] = '.';
  46.             for (Pos coin: c) {
  47.                 if (coin.l == i && coin.c == j) {
  48.                     mat[i][j] = '$';
  49.                 }
  50.             }
  51.         }
  52.     }
  53.    // cout << "Lista initiala de adjaiacenta\n";
  54.     vector<pair<int, int>> ls;
  55.     for (pair<Pos, Pos> portal: p) {
  56.         adj[make_pair(portal.first.l, portal.first.c)].push_back(make_pair(portal.second.l, portal.second.c));
  57.         //cout << portal.first.l << ' ' << portal.first.c << ' ' << portal.second.l << ' ' << portal.second.c << '\n';
  58.         //ls.push_back(make_pair(portal.first.l, portal.first.c));
  59.     }
  60.     //cout << "===========\n";
  61.     //for (pair<int, int> x: adj[make_pair(5, 1)]) {
  62.       //  cout << x.first << ' ' << x.second << '\n';
  63.     //}
  64.  
  65.     auto canTeleport = [&adj](int i, int j){
  66.         pair<int, int> stiva[1000], tp_pos;
  67.         map<pair<int, int>, int> visited;
  68.         int vf = -1;
  69.   //  cout << "i = " << i << ';' << "j = " << j << '\n';
  70.     for (pair<Pos, Pos> portal: p) {
  71.         adj[make_pair(portal.first.l, portal.first.c)].push_back(make_pair(portal.second.l, portal.second.c));
  72.        // cout << portal.first.l << ' ' << portal.first.c << ' ' << portal.second.l << ' ' << portal.second.c << '\n';
  73.        //cout << visited[make_pair(portal.first.l, portal.first.c)] << '\n';
  74.        // ls.push_back(make_pair(portal.first.l, portal.first.c));
  75.     }
  76.         stiva[++vf] = make_pair(i, j);
  77.         visited[make_pair(i, j)] = 1;
  78.         while (vf >= 0) {
  79.             pair<int, int> elem_vf = stiva[vf];
  80.             visited[elem_vf] = 1;
  81.             --vf;
  82.             if (adj[elem_vf].size() == 0)
  83.                 tp_pos = elem_vf;
  84.             if (i == 5 && j == 1) {
  85.               //  cout << elem_vf.first << ' ' << elem_vf.second << '\n';
  86.                 //cout << "VECINII ASTORA DE SUS\n";
  87.             }
  88.             for (pair<int, int> vecini: adj[elem_vf]) {
  89.                 //cout << elem_vf.first << ' ' << elem_vf.second << ' ' << vecini.first << ' ' << vecini.second << '\n';
  90.                 if (!visited[make_pair(vecini.first, vecini.second)]) {
  91.                     stiva[++vf] = make_pair(vecini.first, vecini.second);
  92.                     visited[make_pair(vecini.first, vecini.second)] = 1;
  93.                 } else
  94.                     return make_pair(0, 0); // has cycle when (0, 0)
  95.             }
  96.             //cout << "===================\n" << '\n';
  97.         }
  98.         return tp_pos; //return the player teleporting position
  99.     };
  100.    // tp_pos = canTeleport(1, 1);
  101.     //cout << tp_pos.first << ' ' << tp_pos.second;
  102.  
  103.     for (Pos obstacol: o) {
  104.         mat[obstacol.l][obstacol.c] = '#';
  105.         isObstacle[make_pair(obstacol.l, obstacol.c)] = 1;
  106.     }
  107.  
  108.     if (!isOver) {
  109.         mat[s.l][s.c] = '.';
  110.         if (d == 1) {  //nord
  111.             if (s.l - 1 == 0 || coins < 0) {
  112.                 obstacleEncountered = 1;
  113.                 --coins;
  114.            } else if (isObstacle[make_pair(s.l - 1, s.c)]) {
  115.                 --coins;
  116.                 obstacleEncountered = 1;
  117.             }
  118.             else { // check if it is portal
  119.  
  120.                 for (pair<Pos, Pos> portal: p){
  121.                     i = portal.first.l;
  122.                     j = portal.first.c;
  123.                     if (i == s.l - 1 && j == s.c) {
  124.                         cout << i << ' ' << j << ' ';
  125.                         tp_pos = canTeleport(i, j);
  126.                         cout << "alooo";
  127.                         cout << tp_pos.first << ' ' << tp_pos.second << '\n';
  128.                        if (tp_pos != make_pair(0, 0)) {
  129.                             s.l = tp_pos.first;
  130.                             s.c = tp_pos.second;
  131.                         } else
  132.                             playerEnteredInCyclicPortals = 1;
  133.                        // cout << i << ' ' << j << ' ';
  134.                        //cout << tp_pos.first << ' ' << tp_pos.second << '\n';
  135.                         isInPortal = 1;
  136.                     }
  137.                      break;
  138.                 }
  139.  
  140.                 if (!isInPortal)
  141.                     --s.l;
  142.             }
  143.         } else if (d == 2) { //vest
  144.             if (s.c - 1 == 0 || coins < 0) {
  145.                 --coins;
  146.                 obstacleEncountered = 1;
  147.             } else if (isObstacle[make_pair(s.l, s.c - 1)]) {
  148.                 --coins;
  149.                 obstacleEncountered = 1;
  150.             }
  151.             else {
  152.                 for (pair<Pos, Pos> portal: p) {
  153.                     i = portal.first.l;
  154.                     j = portal.first.c;
  155.                     if (i == s.l && j == s.c - 1) {
  156.                         cout << i << ' ' << j;
  157.                         tp_pos = canTeleport(i, j);
  158.                        if (tp_pos != make_pair(0, 0)) {
  159.                             s.l = tp_pos.first;
  160.                             s.c = tp_pos.second;
  161.                         } else
  162.                             playerEnteredInCyclicPortals = 1;
  163.                         isInPortal = 1;
  164.                        // cout << i << ' ' << j << ' ';
  165.                        //cout << tp_pos.first << ' ' << tp_pos.second << '\n';
  166.                        break;
  167.                     }
  168.                 }
  169.  
  170.                 if (!isInPortal)
  171.                     --s.c;
  172.             }
  173.         } else if (d == 3) { //sud
  174.             if (s.l + 1 == n + 1 || coins < 0) {
  175.                 --coins;
  176.                 obstacleEncountered = 1;
  177.             } else if (isObstacle[make_pair(s.l + 1, s.c)]) {
  178.                 --coins;
  179.                 obstacleEncountered = 1;
  180.             }
  181.             else {
  182.                 for (pair<Pos, Pos> portal: p) {
  183.                     i = portal.first.l;
  184.                     j = portal.first.c;
  185.                     if (i == s.l + 1 && j == s.c) {
  186.                          cout << i << ' ' << j;
  187.                         tp_pos = canTeleport(i, j);
  188.                         if (tp_pos != make_pair(0, 0)) {
  189.                             s.l = tp_pos.first;
  190.                             s.c = tp_pos.second;
  191.                         } else
  192.                             playerEnteredInCyclicPortals = 1;
  193.                      //  cout << i << ' ' << j << ' ';
  194.                        //cout << tp_pos.first << ' ' << tp_pos.second << '\n';
  195.                         isInPortal = 1;
  196.                          break;
  197.                     }
  198.                 }
  199.                 if (!isInPortal)
  200.                     ++s.l;
  201.             }
  202.         } else { // est
  203.             if (s.c + 1 == m + 1 || coins < 0) {
  204.                 obstacleEncountered = 1;
  205.                 --coins;
  206.             } else if (isObstacle[make_pair(s.l, s.c + 1)]) {
  207.                 --coins;
  208.                 obstacleEncountered = 1;
  209.             }
  210.             else {
  211.                 for (pair<Pos, Pos> portal: p) {
  212.                     i = portal.first.l;
  213.                     j = portal.first.c;
  214.                     if (i == s.l && j == s.c + 1) {
  215.                          cout << i << ' ' << j;
  216.                         tp_pos = canTeleport(i, j);
  217.                         if (tp_pos != make_pair(0, 0)) {
  218.                             s.l = tp_pos.first;
  219.                             s.c = tp_pos.second;
  220.                         } else
  221.                             playerEnteredInCyclicPortals = 1;
  222.                         isInPortal = 1;
  223.                        //  cout << i << ' ' << j << ' ';
  224.                        //cout << tp_pos.first << ' ' << tp_pos.second << '\n';
  225.                        break;
  226.                     }
  227.                 }
  228.  
  229.                 if (!isInPortal)
  230.                     ++s.c;
  231.             }
  232.         }
  233.  
  234.         if (mat[s.l][s.c] == '$' && !isTaken[make_pair(s.l, s.c)]) {
  235.             mat[s.l][s.c] = 'x';
  236.             isTaken[make_pair(s.l, s.c)] = 1;
  237.             //cout << s.l << ' ' << s.c << ' ' << coins << '\n';
  238.             ++total;
  239.             ++coins;
  240.         }
  241.     }
  242.     cout << s.l << ' ' << s.c << '\n';
  243.     for (int i = 1; i <= n; ++i) {
  244.         for (int j = 1; j <= m; ++j) {
  245.             if (i == s.l && j == s.c) {
  246.                 cout << 'x'; /// pozitia jucatorului
  247.             } else if (isObstacle[make_pair(i, j)] == 1) {
  248.                 cout << '#';
  249.             } else if (mat[i][j] == '$'){
  250.                 if (isTaken[make_pair(i, j)])
  251.                     cout << '.';
  252.                 else
  253.                     cout << '$';
  254.             } else {
  255.                 isInPortal = 0;
  256.                 for (pair<Pos, Pos> portal: p) {
  257.                     if (portal.first.l == i && portal.first.c == j || portal.second.l == i && portal.second.c == j) {
  258.                         cout << 'O';
  259.                         isInPortal = 1;
  260.                         break;
  261.                     }
  262.                 }
  263.                 if (!isInPortal)
  264.                     cout << '.';
  265.             }
  266.         }
  267.         cout << '\n';
  268.     }
  269.    // cout << !noObstacleTaken << ' ' << coins << ' ' << (coins == c.size()) << '\n';
  270.    // cout << coins << ' ' << c.size() << '\n';
  271.     if (total == c.size()) {
  272.         cout << "Wow! - Game over: You won!\n";
  273.         isOver = 1;
  274.     }else if (coins >= 0 && obstacleEncountered) {
  275.          cout << "Ups! - Coins: " << coins << '\n';
  276.         ++noObstacleTaken;
  277.     }else if (coins < 0)
  278.         cout << "Ups! - Game over: You lost!\n";
  279.     else if (playerEnteredInCyclicPortals) {
  280.         cout << "Ups! - Game over: Goodbye!\n";
  281.         isOver = 1;
  282.     }else
  283.         cout << "Coins: " << coins << '\n';
  284. }
  285.  
  286. int main(int argc, const char* argv[])
  287. {
  288.     if (argc == 1)
  289.     {
  290.         cout << "No arguments";
  291.         return 1;
  292.     }
  293.  
  294.     string inputFile = argv[1];
  295.     ifstream in(inputFile.c_str(), ios::in);
  296.     std::streambuf *cinbuf = std::cin.rdbuf();      // save stdin buffer
  297.     std::cin.rdbuf(in.rdbuf());                     // redirect std::cin to input file (.in)
  298.     if (!in.is_open())
  299.     {
  300.         cout << "Cannot open input file";
  301.         return 1;
  302.     }
  303.  
  304.     string line;
  305.  
  306.     getline(in, line);
  307.     std::istringstream smn(line);
  308.     smn >> n >> m; /// line coloumn
  309.  
  310.     getline(in, line);
  311.     std::istringstream ss(line);
  312.     ss >> s.l >> s.c; /// player's position
  313.  
  314.  
  315.     getline(in, line);
  316.     int no = atoi(line.c_str()); /// nr obstacole
  317.     for (int i = 0; i < no; i++)
  318.     {
  319.         Pos p;
  320.  
  321.         getline(in, line);
  322.         std::istringstream sl(line);
  323.         sl >> p.l >> p.c;   /// coordonate obstacole
  324.  
  325.         o.push_back(p); /// obstacolele sunt marcate cu $
  326.     }
  327.  
  328.  
  329.     getline(in, line);
  330.     int nc = atoi(line.c_str());
  331.     for (int i = 0; i < nc; i++) /// coins
  332.     {
  333.         Pos p;
  334.  
  335.         getline(in, line);
  336.         std::istringstream sl(line);
  337.         sl >> p.l >> p.c;
  338.  
  339.         c.push_back(p);
  340.     }
  341.  
  342.  
  343.     getline(in, line);
  344.     int np = atoi(line.c_str()); /// nr puncte
  345.     for (int i = 0; i < np; i++)
  346.     {
  347.         Pos p1, p2;
  348.  
  349.         getline(in, line);
  350.         std::istringstream sl(line);
  351.         sl >> p1.l >> p1.c >> p2.l >> p2.c;
  352.  
  353.         p.push_back({ p1, p2 }); /// pozitiile punctelor
  354.     }
  355.  
  356.  
  357.     getline(in, line);
  358.     int nm = atoi(line.c_str()); /// nr de mutari al jucatorului
  359.     getline(in, line);
  360.     std::istringstream sm(line);
  361.     for (int i = 0; i < nm; i++) /// citim fiecare mutare
  362.     {
  363.         int d;
  364.         sm >> d;
  365.         f(d);
  366.     }
  367.  
  368.     std::cin.rdbuf(cinbuf);                        // reset to stdin again
  369.  
  370.     return 0;
  371. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement