Submission #1259367

#TimeUsernameProblemLanguageResultExecution timeMemory
1259367arnob_chowdhuryKnapsack (NOI18_knapsack)C++20
0 / 100
5 ms12868 KiB
#include <bits/stdc++.h>
using namespace std;

struct Node {
    int pos, len, dir;
};

int n, m, s, e;
vector<char> grid;
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
int dis[200005][4][4];
queue<Node> q;

int to(int i, int j) { return (i - 1) * m + j; }

int bfs() {
    for (int d = 0; d < 4; ++d) {
        q.push({s, 1, d});
        dis[s][1][d] = 0;
    }

    while (!q.empty()) {
        Node u = q.front(); q.pop();
        if (u.pos == e) return dis[e][u.len][u.dir];

        for (int i = 0; i < 4; ++i) {
            Node v = u;
            v.pos += dx[i] * m + dy[i];
            v.len = (u.dir == i) ? u.len + 1 : 1;
            v.dir = i;

            if (v.pos < 1 || v.pos > n * m || v.len > 3) continue;
            if (dis[v.pos][v.len][v.dir] != 0x3f3f3f3f) continue;
            if (grid[v.pos] == '#') continue;

            dis[v.pos][v.len][v.dir] = dis[u.pos][u.len][u.dir] + 1;
            q.push(v);
        }
    }
    return -1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    memset(dis, 0x3f, sizeof dis);
    cin >> n >> m;
    grid.resize(n * m + 1);

    for (int i = 1; i <= n * m; ++i) {
        cin >> grid[i];
        if (grid[i] == 'S') s = i;
        if (grid[i] == 'T') e = i;
    }

    cout << bfs();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...