Submission #1165162

#TimeUsernameProblemLanguageResultExecution timeMemory
1165162JelalTkm로봇 (APIO13_robots)C++20
30 / 100
115 ms12184 KiB
#include <bits/stdc++.h>
// #pragma GCC optimize ("O3")
// #pragma GCC target ("sse4")

using namespace std;

#define int long long int

const int N = 3e2 + 10;
const int md = 1e9 + 7;
const int INF = 1e18;

struct node {
  int x;
  int y;
  char nap;
};

int con(char c) {
  if (c == '>')
    return 0;
  else if (c == '<')
    return 1;
  else if (c == '^')
    return 2;
  else 
    return 3;
}

int n, m;
vector<vector<char>> a(N, vector<char> (N));

bool check(int x, int y) {
  return (x >= 1 && y >= 1 && x <= n && y <= m);
}

node f(int x, int y, char nap) {
  int nx = x, ny = y;
  char nnap = nap;
  if (a[x][y] != 'A' && a[x][y] != 'C' && a[x][y] != 'x') {
    if (nap == '>')
      ny++;
    if (nap == '<')
      ny--;
    if (nap == '^')
      nx--;
    if (nap == 'v')
      nx++;
  } else {
    if (a[x][y] == 'A') {
      if (nap == '>') {
        nnap = '^';
        nx--;
      }
      if (nap == '<') {
        nnap = 'v';
        nx++;
      }
      if (nap == '^') {
        nnap = '<';
        ny--;
      }
      if (nap == 'v') {
        nnap = '>';
        ny++;
      }
    } else if (a[x][y] == 'C') {
      if (nap == '>') {
        nnap = 'v';
        nx++;
      }
      if (nap == '<') {
        nnap = '^';
        nx--;
      }
      if (nap == '^') {
        nnap = '>';
        ny++;
      }
      if (nap == 'v') {
        nnap = '<';
        ny--;
      }
    }
  }

  if (check(nx, ny) && a[nx][ny] != 'x')
    return {nx, ny, nnap};
  else return {x, y, nnap};
}

map<pair<int, int>, int> bfs(int x, int y) {
  queue<node> q;
  queue<int> cou;
  map<pair<int, int>, int> mp;
  if (a[x][y] == 'x')
    return mp;
  vector<vector<vector<bool>>> visited(n + 1, vector<vector<bool>> (m + 1, vector<bool> (4)));
  q.push({x, y, '>'}); visited[x][y][0] = 1;
  q.push({x, y, '<'}); visited[x][y][1] = 1;
  q.push({x, y, '^'}); visited[x][y][2] = 1;
  q.push({x, y, 'v'}); visited[x][y][3] = 1;
  cou.push(1);cou.push(1);cou.push(1);cou.push(1);
  mp[{x, y}] = INF;

  while (!q.empty()) {
    auto [xx, yy, nn] = q.front();
    int cn = cou.front();
    q.pop();cou.pop();
    auto v = f(xx, yy, nn);
    if (v.x == xx && v.y == yy) {
      if (mp[{xx, yy}] == 0)
        mp[{xx, yy}] = cn;
      if (!visited[v.x][v.y][0]) {
        q.push({v.x, v.y, '>'}); visited[v.x][v.y][0] = 1;
        visited[v.x][v.y][0] = 1;
        cou.push(cn + 1);
      }
      if (!visited[v.x][v.y][1]) {
        q.push({v.x, v.y, '<'}); visited[v.x][v.y][1] = 1;
        visited[v.x][v.y][1] = 1;
        cou.push(cn + 1);
      }
      if (!visited[v.x][v.y][2]) {
        q.push({v.x, v.y, '^'}); visited[v.x][v.y][2] = 1;
        visited[v.x][v.y][2] = 1;
        cou.push(cn + 1);
      }
      if (!visited[v.x][v.y][3]) {
        q.push({v.x, v.y, 'v'}); visited[v.x][v.y][3] = 1;
        visited[v.x][v.y][3] = 1;
        cou.push(cn + 1);
      }
    } else {
      if (!visited[v.x][v.y][con(v.nap)]) {
        q.push(v);
        visited[v.x][v.y][con(v.nap)] = 1;
        cou.push(cn);
      }
    }
  }

  return mp;
}

int32_t main(int32_t argc, char *argv[]) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int T = 1;
  // cin >> T;
  while (T--) {
    int c;
    cin >> c >> m >> n;
    vector<pair<int, int>> nu(10);
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) {
        cin >> a[i][j];
        if (a[i][j] >= '1' && a[i][j] <= '9')
          nu[(a[i][j] - '0')] = {i, j};
      }

    if (c == 1) {
      cout << 0 << '\n';
      continue;
    }

    map<pair<int, int>, int> mp1, mp2;
    for (int i = 1; i <= c; i++) {
      auto [x, y] = nu[i];
      if (i == 1)
        mp1 = bfs(x, y);
      else mp2 = bfs(x, y);
    }

    int ans = INF;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
        int fi = mp1[{i, j}], se = mp2[{i, j}];
        if (fi != 0 && se != 0) {
          ans = min(ans, (fi == INF ? 0 : fi) + (se == INF ? 0 : se));
        }
      }
    }

    cout << (ans == INF ? -1 : ans) << '\n';
  }
 
  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...