/*
* Author: Nonoze
* Created: Thursday 06/03/2025
*/
#include <bits/stdc++.h>
using namespace std;
#ifndef DEBUG
#define dbg(...)
#endif
// #define cout cerr << "OUT: "
#define endl '\n'
#define endlfl '\n' << flush
#define quit(x) return (void)(cout << x << endl)
template<typename T> void read(T& x) { cin >> x;}
template<typename T1, typename T2> void read(pair<T1, T2>& p) { read(p.first), read(p.second);}
template<typename T> void read(vector<T>& v) { for (auto& x : v) read(x); }
template<typename T1, typename T2> void read(T1& x, T2& y) { read(x), read(y); }
template<typename T1, typename T2, typename T3> void read(T1& x, T2& y, T3& z) { read(x), read(y), read(z); }
template<typename T1, typename T2, typename T3, typename T4> void read(T1& x, T2& y, T3& z, T4& zz) { read(x), read(y), read(z), read(zz); }
template<typename T> void print(vector<T>& v) { for (auto& x : v) cout << x << ' '; cout << endl; }
#define sz(x) (int)(x.size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define make_unique(v) sort(all(v)), v.erase(unique(all(v)), (v).end())
#define pb push_back
#define mp(a, b) make_pair(a, b)
#define fi first
#define se second
#define cmin(a, b) a = min(a, b)
#define cmax(a, b) a = max(a, b)
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define QYES quit("YES")
#define QNO quit("NO")
#define int long long
#define double long double
const int inf = numeric_limits<int>::max() / 4;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int MOD = 1e9+7, LOG=20;
void solve();
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int tt=1;
// cin >> tt;
while(tt--) solve();
return 0;
}
int n, k, m;
vector<string> a;
vector<pair<int, int>> moves={{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
bool ok(int i, int j) {
return i>=0 && i<n && j>=0 && j<m && a[i][j]!='#';
}
void solve() {
read(n, m);
a.clear(), a.resize(n); read(a);
vector<vector<int>> up(n, vector<int>(m, -1)), down(n, vector<int>(m, -1)), left(n, vector<int>(m, -1)), right(n, vector<int>(m, -1));
for (int i=0; i<n; i++) for (int j=0; j<m; j++) if (a[i][j]!='#') left[i][j]=(j?left[i][j-1]:-1)+1, up[i][j]=(i?up[i-1][j]:-1)+1;
for (int i=n-1; i>=0; i--) for (int j=m-1; j>=0; j--) if (a[i][j]!='#') right[i][j]=(j+1<m?right[i][j+1]:-1)+1, down[i][j]=(i+1<n?down[i+1][j]:-1)+1;
priority_queue<vector<int>> q; for (int i=0; i<n; i++) for (int j=0; j<m; j++) if (a[i][j]=='S') q.push({0, i, j, 0});
vector<vector<vector<int>>> dist(n, vector<vector<int>>(m, vector<int>(2, inf))); dist[q.top()[1]][q.top()[2]][0]=0;
while (!q.empty()) {
int d=-q.top()[0], i=q.top()[1], j=q.top()[2], already=q.top()[3]; q.pop();
if (dist[i][j][already]!=d) continue;
for (auto [u, v]: moves) {
if (ok(i+u, j+v) && dist[i+u][j+v][already]>d+1) {
dist[i+u][j+v][already]=d+1;
q.push({-d-1, i+u, j+v, already});
}
}
if (already) continue;
int mini=min({left[i][j], right[i][j], up[i][j], down[i][j]})+1;
if (dist[i][j-left[i][j]][1]>d+mini) {
dist[i][j-left[i][j]][1]=d+mini;
q.push({-d-mini, i, j-left[i][j], 1});
}
if (dist[i][j+right[i][j]][1]>d+mini) {
dist[i][j+right[i][j]][1]=d+mini;
q.push({-d-mini, i, j+right[i][j], 1});
}
if (dist[i-up[i][j]][j][1]>d+mini) {
dist[i-up[i][j]][j][1]=d+mini;
q.push({-d-mini, i-up[i][j], j, 1});
}
if (dist[i+down[i][j]][j][1]>d+mini) {
dist[i+down[i][j]][j][1]=d+mini;
q.push({-d-mini, i+down[i][j], j, 1});
}
}
int ans=inf;
for (int i=0; i<n; i++) for (int j=0; j<m; j++) if (a[i][j]=='C') ans=min(dist[i][j][0], dist[i][j][1]);
cout << ans << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |