Closest Coin

#include <algorithm>
#include <queue>
#include <set>
#include <vector>

std::pair<int, int> exhaustive_search_closest_coin(
    const std::pair<int, int> &start,
    const std::set<std::pair<int, int>> &coins, int square_length) {
    const auto result = std::min_element(
        coins.begin(), coins.end(),
        [&](const std::pair<int, int> &left, const std::pair<int, int> &right) {
            return std::abs(start.first - left.first) +
                       std::abs(start.second - left.second) <
                   std::abs(start.first - right.first) +
                       std::abs(start.second - right.second);
        });
    return *result;
}

std::pair<int, int> bfs_search_closest_coin(
    const std::pair<int, int> &start,
    const std::set<std::pair<int, int>> &coins, int square_length) {
    const std::vector<int> dir = {-1, 0, 1, 0, -1};
    std::queue<std::pair<int, int>> q;
    q.push(start);
    std::vector<std::vector<int>> visited(square_length,
                                          std::vector<int>(square_length, 0));

    while (!q.empty()) {
        int n = q.size();
        while (n) {
            std::pair<int, int> cur = q.front();
            q.pop();
            n--;

            if (visited[cur.first][cur.second]) {
                continue;
            }

            visited[cur.first][cur.second] = 1;

            if (coins.count(cur)) {
                return cur;
            }

            for (int i = 1; i < dir.size(); i++) {
                int new_x = cur.first + dir[i - 1];
                int new_y = cur.second + dir[i];

                if (new_x >= 0 && new_x < square_length && new_y >= 0 &&
                    new_y < square_length) {
                    q.push({new_x, new_y});
                }
            }
        }
    }

    return {};
}

Last updated

Was this helpful?