Untitled

 avatar
unknown
c_cpp
2 years ago
3.3 kB
5
Indexable
#include <vector>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <iostream>
#include <queue>
#include <algorithm>

class Solution {
public:
    struct Info {
        int coord;
        int weight;
        bool canJumpBack;
    };

    int minimumJumps(std::vector<int>& forbidden, int a, int b, int x) {
        //std::unordered_set<int> forbidden_set = { forbidden.begin(), forbidden.end() };
        std::unordered_set<int> forbidden_set = { forbidden.begin(), forbidden.end() };
        int max_forbidden = std::max(*std::max_element(forbidden.begin(), forbidden.end()), x);
        std::stack<Info> paths;
        if (forbidden_set.find(a) != forbidden_set.end()) return -1;
        if (a == x) return 1;
        paths.push({ a, 1, true });
        int min = -1;
        int max_visited = a;
        std::unordered_set<int> visited = { 0, a };
        while (!paths.empty()) {
            Info path = paths.top();
            paths.pop();
            int jump_a = path.coord + a;
            int jump_b = path.coord - b;
            if (jump_b > max_forbidden + a) continue;
            int weight = path.weight + 1;
            if (min != -1 && weight > min) continue;
            if (path.weight == 120) {
                std::cout << path.weight << std::endl;
            }
            if (forbidden_set.find(jump_a) == forbidden_set.end()) {
                if (jump_a == x) {
                    if ((min == -1) || (min > weight)) {
                        min = weight;
                    }
                }
                paths.push({ jump_a, path.weight + 1, true });
            }
            if (path.canJumpBack) {
                if ((jump_b > 0) && (visited.find(jump_b) == visited.end()) && (forbidden_set.find(jump_b) == forbidden_set.end())) {
                    if (jump_b == x) {
                        if ((min == -1) || (min > weight)) {
                            min = weight;
                        }
                    }
                    paths.push({ jump_b, path.weight + 1, false });
                    visited.insert(jump_b);
                }
            }
        }
        return min;
    }
};

int main() {
    std::vector<int> vec = { 1401,832,1344,173,1529,1905,1732,277,1490,650,1577,1886,185,1728,1827,1924,1723,1034,1839,1722,1673,1198,1667,538,911,1221,1201,1313,251,752,40,1378,1515,1789,1580,1422,907,1536,294,1677,1807,1419,1893,654,1176,812,1094,1942,876,777,1850,1382,760,347,112,1510,1278,1607,1491,429,1902,1891,647,1560,1569,196,539,836,290,1348,479,90,1922,111,1411,1286,1362,36,293,1349,667,430,96,1038,793,1339,792,1512,822,269,1535,1052,233,1835,1603,577,936,1684,1402,1739,865,1664,295,977,1265,535,1803,713,1298,1537,135,1370,748,448,254,1798,66,1915,439,883,1606,796 };
    int a = 19;
    int b = 18;
    int x = 1540;
    Solution sol;
    std::cout << sol.minimumJumps(vec, a, b, x) << std::endl;
    /*int counter = 0;
    int val = 0;
    for (int i = 0; i < 1000; ++i) {
        val += a;
        ++counter;
        if (val == x) break;
        if (val > b) {
            val -= b;
            ++counter;
        }
    }
    std::cout << counter << std::endl;
    */
    return 0;
}
Editor is loading...