Submission #494044

#TimeUsernameProblemLanguageResultExecution timeMemory
494044goodluck2020Portals (BOI14_portals)C++14
70 / 100
22 ms5164 KiB
#include <bits/stdc++.h>
#define task "portals"

using namespace std;
const int N = 1e3 + 5;
int n, m, A[N][N];
struct Data
{
    int x, y;
} S, C, D;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
struct Data2
{
    int x, y, w;
} P;
struct cmp
{
    bool operator() (Data2 A, Data2 B)
    {
        return A.w > B.w;
    }
};
priority_queue < Data2, vector < Data2 > , cmp > pq;
namespace sub4
{
    queue < Data > Q;
    int Visited[N][N], dist[N][N], wall[N][N];
    void Build()
    {
        for(int i = 0; i <= n + 1; i++)
            for(int j = 0; j <= m + 1; j++)
        if(A[i][j] == 0) Q.push({i, j}), Visited[i][j] = 1;
        while(!Q.empty())
        {
            Data D = Q.front(); Q.pop();
            for(int i = 0; i < 4; i++)
            {
                int x = D.x + dx[i];
                int y = D.y + dy[i];
                if(A[x][y] && !Visited[x][y])
                {
                    Q.push({x, y});
                    wall[x][y] = wall[D.x][D.y] + 1;
                    Visited[x][y] = 1;
                }
            }
        }
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++) Visited[i][j] = 0, dist[i][j] = 1e9;

    }
    void Go(int x, int y, int cost)
    {
        if(dist[x][y] <= dist[P.x][P.y] + cost) return;
        dist[x][y] = dist[P.x][P.y] + cost;
        pq.push({x, y, dist[x][y]});
    }
    void solve()
    {
        Build();
        pq.push({S.x, S.y, 0}); dist[S.x][S.y] = 0;
        while(!pq.empty())
        {
            P = pq.top(); pq.pop();
            for(int i = 0; i < 4; i++)
            {
                int x = P.x + dx[i];
                int y = P.y + dy[i];
                if(A[x][y]) Go(x, y, 1);
            }
                int x, y;
                x = P.x; y = P.y;
                while(A[x - 1][y]) x--;
                Go(x, y, wall[P.x][P.y]);
                x = P.x; y = P.y;
                while(A[x + 1][y]) x++;
                Go(x, y, wall[P.x][P.y]);
                x = P.x; y = P.y;
                while(A[x][y - 1]) y--;
                Go(x, y, wall[P.x][P.y]);
                x = P.x; y = P.y;
                while(A[x][y + 1]) y++;
                Go(x, y, wall[P.x][P.y]);
        }
        cout << dist[C.x][C.y];
    }
}
int main()
{
    if(fopen(task ".inp","r"))
    {
        freopen(task ".inp","r",stdin);
        freopen(task ".out","w",stdout);
    }
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            char ch;
            cin >> ch;
            if(ch == 'S') S = {i, j};
            if(ch == 'C') C = {i, j};
            if(ch != '#') A[i][j] = 1;
        }
    if(n <= 200 && m <= 200) sub4::solve();
}

Compilation message (stderr)

portals.cpp: In function 'int main()':
portals.cpp:93:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |         freopen(task ".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
portals.cpp:94:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |         freopen(task ".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...