Submission #1351156

#TimeUsernameProblemLanguageResultExecution timeMemory
1351156tit_manh로봇 (APIO13_robots)C++20
0 / 100
0 ms344 KiB
/*
    author : TIT_manh
*/
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <deque>
#include <bitset>
#include <numeric> 
#include <functional>
#include <cassert>
#include <sstream>
#include <climits>
#define ll long long
#define ull unsigned long long
#define FOR(i,l,r) for (int i = l; i <= r; i++)
#define FOD(i,r,l) for (int i = r; i >= l; i--)
#define fi first
#define se second
#define pb push_back
#define endl "\n"
#define m_int 0x3f3f3f3f
#define m_ll 0x3f3f3f3f3f3f3f3f
using namespace std;

int n, m, k;

void ciin() {
    cin >> k >> m >> n;
}

bool vst[11][11][5];
// 1 : len    0  1
// 2 : xuong  0 -1
// 3 : trai  -1  0
// 4 : phai   1  0

struct tt {
    int x, y, pp;
};

int d1[5] = {0, 0, 0, -1, 1};
int d2[5] = {0, 1, -1, 0, 0};
int ax(int i, int j) {
    return (i - 1) * m + j;
}

vector<int> grid[105];
int dist1[105];
int dist2[105];

void sub1() {
    vector<vector<char>> a(n + 2, vector<char>(m + 2, 'x'));
    FOR(i,1,n) FOR(j,1,m) cin >> a[i][j];
    int v1, v2;
    FOR(i,1,n) FOR(j,1,m) {
        // khong tao khuyen
        // xet chu trinh
        if (a[i][j] == '1') v1 = ax(i, j);
        if (a[i][j] == '2') v2 = ax(i, j);
        memset(vst, false, sizeof vst);
        queue<tt> q;
        FOR(tst,1,4) {
            int p = tst;
            if (a[i][j] == 'A') {
                if (p == 1) p = 3;
                else if (p == 2) p = 4;
                else if (p == 3) p = 2;
                else p = 1;
            }
            else if (a[i][j] == 'C') {
                if (p == 1) p = 4;
                else if (p == 2) p = 3;
                else if (p == 3) p = 1;
                else p = 2;
            }
            q.push({i, j, p});
        }
        while (!q.empty()) {
            auto [x, y, p] = q.front(); q.pop();
            if (vst[x][y][p]) continue;
            vst[x][y][p] = true;
            int tx = x + d1[p], ty = y + d2[p];
            if (a[tx][ty] == 'x') {
                int t1 = ax(i, j), t2 = ax(x, y);
                if (t1 != t2) grid[t1].pb(t2);
            }
            else {
                if (a[tx][ty] == 'A') {
                    if (p == 1) p = 3;
                    else if (p == 2) p = 4;
                    else if (p == 3) p = 2;
                    else p = 1;
                }
                else if (a[tx][ty] == 'C') {
                    if (p == 1) p = 4;
                    else if (p == 2) p = 3;
                    else if (p == 3) p = 1;
                    else p = 2;
                }
                q.push({tx, ty, p});
            }
        }
    }
    // dijkstra
    memset(dist1, -1, sizeof dist1);
    queue<int> pq;
    dist1[v1] = 0;
    pq.push(v1);
    while (!pq.empty()) {
        int u = pq.front(); pq.pop();
        for (auto& v : grid[u]) if (dist1[v] == -1) {
            dist1[v] = dist1[u] + 1;
            pq.push(v);
        }
    }
    memset(dist2, -1, sizeof dist2);
    dist2[v2] = 0;
    pq.push(v2);
    while (!pq.empty()) {
        int u = pq.front(); pq.pop();
        for (auto& v : grid[u]) if (dist2[v] == -1) {
            dist2[v] = dist2[u] + 1;
            pq.push(v);
        }
    }
    int res = m_int;
    FOR(i,1,ax(n, m)) if (dist1[i] != -1 && dist2[i] != -1) {
        res = min(res, dist1[i] + dist2[i]);
        cout << dist1[i] << ' ' << dist2[i] << endl;
    }
    cout << ((res == m_int) ? -1 : res);
}

void solve() {
    if (k == 1) cout << 0 << endl;
    else if (k == 2 && n <= 10 && m <= 10) sub1();
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    ciin(); solve();
    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...