Submission #49982930


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/modint>

namespace {
    using ModInt [[maybe_unused]] = atcoder::modint998244353;
    using Num [[maybe_unused]] = long long int;
    using Vec [[maybe_unused]] = std::vector<Num>;
    using Set [[maybe_unused]] = std::set<Num>;
    using Mset [[maybe_unused]] = std::multiset<Num>;
    using Edges [[maybe_unused]] = std::vector<std::vector<Num>>;

    template<typename T>
    using Q [[maybe_unused]] = std::queue<T>;

    template<typename T>
    using PQ [[maybe_unused]] = std::priority_queue<T, std::vector<T>, std::greater<T>>;
}

Num n {0};
constexpr Num MaxLen = 64;
constexpr Num N_Cells = MaxLen * MaxLen;
constexpr Num N_States = N_Cells * N_Cells;
bool grid[MaxLen][MaxLen];

Num position_to_state(Num y, Num x) {
    return y * MaxLen + x;
}

std::pair<Num, Num> to_yxs(Num state) {
    const Num y = state / MaxLen;
    const Num x = state % MaxLen;
    return std::make_pair(y, x);
}

Num board_state(Num y1, Num x1, Num y2, Num x2) {
    const Num s1 = position_to_state(y1, x1);
    const Num s2 = position_to_state(y2, x2);
    return (s1 == s2) ? 0 : (s1 * N_Cells + s2);
}

std::tuple<Num, Num, Num, Num> to_positions(Num state) {
    const auto [y1, x1] = to_yxs(state / N_Cells);
    const auto [y2, x2] = to_yxs(state % N_Cells);
    return std::make_tuple(y1, x1, y2, x2);
}

void solve(std::istream& is, std::ostream& os) {
    is >> n;

    for(Num y{0}; y<=(n+1); ++y) {
        for(Num x{0}; x<=(n+1); ++x) {
            grid[y][x] = true;
        }
    }

    std::vector<std::pair<Num, Num>> ps;
    for(Num y{1}; y<=n; ++y) {
        std::string s;
        is >> s;

        for(Num x{1}; x<=n; ++x) {
            const auto c = s.at(x-1);
            grid[y][x] = (c == '#');
            if (c == 'P') {
                ps.push_back(std::make_pair(y, x));
            }
        }
    }

    const std::vector<std::pair<Num, Num>> dyxs {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
    using Distance = int64_t;
    constexpr Num Inf = std::numeric_limits<Distance>::max() / 2;
    std::vector<Distance> distances(N_States, Inf);

    Q<std::pair<Num, Num>> q;
    const auto start = board_state(ps.at(0).first, ps.at(0).second, ps.at(1).first, ps.at(1).second);
    q.push(std::make_pair(0, start));
    while(!q.empty()) {
        const auto [dist, from] = q.front();
        q.pop();

        if (distances.at(from) <= dist) {
            continue;
        }
        distances.at(from) = dist;

        const auto next_dist = dist + 1;
        for(const auto& [dy, dx] : dyxs) {
            const auto [y1, x1, y2, x2] = to_positions(from);
                if (grid[y1][x1] || grid[y2][x2]) {
                    continue;
                }

                Num ny1 = y1 + dy;
                Num nx1 = x1 + dx;
                if (grid[ny1][nx1]) {
                    ny1 = y1;
                    nx1 = x1;
                }

                Num ny2 = y2 + dy;
                Num nx2 = x2 + dx;
                if (grid[ny2][nx2]) {
                    ny2 = y2;
                    nx2 = x2;
                }

                const auto to = board_state(ny1, nx1, ny2, nx2);
                if (from == to) {
                    continue;
                }

                if (distances.at(to) <= next_dist) {
                    continue;
                }
                q.push(std::make_pair(next_dist, to));
            }
    }

    auto answer = distances.at(0);
    if (answer >= Inf) {
        answer = -1;
    }

    os << answer << "\n";
}

int main(void) {
    solve(std::cin, std::cout);
    return 0;
}

Submission Info

Submission Time
Task D - Synchronized Players
User zettsut
Language C++ 20 (gcc 12.2)
Score 400
Code Size 3724 Byte
Status AC
Exec Time 1074 ms
Memory 141640 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 3
AC × 55
Set Name Test Cases
Sample sample00.txt, sample01.txt, sample02.txt
All sample00.txt, sample01.txt, sample02.txt, testcase00.txt, testcase01.txt, testcase02.txt, testcase03.txt, testcase04.txt, testcase05.txt, testcase06.txt, testcase07.txt, testcase08.txt, testcase09.txt, testcase10.txt, testcase11.txt, testcase12.txt, testcase13.txt, testcase14.txt, testcase15.txt, testcase16.txt, testcase17.txt, testcase18.txt, testcase19.txt, testcase20.txt, testcase21.txt, testcase22.txt, testcase23.txt, testcase24.txt, testcase25.txt, testcase26.txt, testcase27.txt, testcase28.txt, testcase29.txt, testcase30.txt, testcase31.txt, testcase32.txt, testcase33.txt, testcase34.txt, testcase35.txt, testcase36.txt, testcase37.txt, testcase38.txt, testcase39.txt, testcase40.txt, testcase41.txt, testcase42.txt, testcase43.txt, testcase44.txt, testcase45.txt, testcase46.txt, testcase47.txt, testcase48.txt, testcase49.txt, testcase50.txt, testcase51.txt
Case Name Status Exec Time Memory
sample00.txt AC 46 ms 134368 KiB
sample01.txt AC 46 ms 134372 KiB
sample02.txt AC 46 ms 134372 KiB
testcase00.txt AC 113 ms 134328 KiB
testcase01.txt AC 82 ms 134384 KiB
testcase02.txt AC 95 ms 134324 KiB
testcase03.txt AC 64 ms 134236 KiB
testcase04.txt AC 102 ms 134316 KiB
testcase05.txt AC 291 ms 135044 KiB
testcase06.txt AC 417 ms 135168 KiB
testcase07.txt AC 282 ms 135036 KiB
testcase08.txt AC 395 ms 135120 KiB
testcase09.txt AC 283 ms 135020 KiB
testcase10.txt AC 421 ms 135416 KiB
testcase11.txt AC 330 ms 134984 KiB
testcase12.txt AC 408 ms 135480 KiB
testcase13.txt AC 417 ms 135340 KiB
testcase14.txt AC 426 ms 135528 KiB
testcase15.txt AC 106 ms 134336 KiB
testcase16.txt AC 121 ms 134832 KiB
testcase17.txt AC 52 ms 134404 KiB
testcase18.txt AC 55 ms 134328 KiB
testcase19.txt AC 49 ms 134324 KiB
testcase20.txt AC 54 ms 134272 KiB
testcase21.txt AC 51 ms 134320 KiB
testcase22.txt AC 167 ms 135436 KiB
testcase23.txt AC 125 ms 134904 KiB
testcase24.txt AC 670 ms 139124 KiB
testcase25.txt AC 1029 ms 140836 KiB
testcase26.txt AC 979 ms 141640 KiB
testcase27.txt AC 1074 ms 140272 KiB
testcase28.txt AC 859 ms 139620 KiB
testcase29.txt AC 1011 ms 139992 KiB
testcase30.txt AC 634 ms 138796 KiB
testcase31.txt AC 1026 ms 139776 KiB
testcase32.txt AC 950 ms 141004 KiB
testcase33.txt AC 908 ms 139688 KiB
testcase34.txt AC 629 ms 137760 KiB
testcase35.txt AC 875 ms 138904 KiB
testcase36.txt AC 784 ms 139880 KiB
testcase37.txt AC 908 ms 140036 KiB
testcase38.txt AC 698 ms 139808 KiB
testcase39.txt AC 876 ms 138328 KiB
testcase40.txt AC 765 ms 138944 KiB
testcase41.txt AC 890 ms 140760 KiB
testcase42.txt AC 574 ms 137244 KiB
testcase43.txt AC 769 ms 138676 KiB
testcase44.txt AC 533 ms 136976 KiB
testcase45.txt AC 799 ms 138676 KiB
testcase46.txt AC 701 ms 137608 KiB
testcase47.txt AC 734 ms 138764 KiB
testcase48.txt AC 421 ms 136304 KiB
testcase49.txt AC 699 ms 138036 KiB
testcase50.txt AC 401 ms 136308 KiB
testcase51.txt AC 577 ms 136808 KiB