Cod sursa(job #2295946)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 4 decembrie 2018 01:25:49
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <string>
#pragma GCC optimize("unroll-loops")

#define N 1005
#define f first
#define s second
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[N][N],i,j,n,m,dp[N][N];
const int dx[4] = {0,0,-1,1};
const int dy[4] = {-1,1,0,0};
deque<pair<int,int> >q;
inline bool valid(int x,int y)
{
    if(x < 0 || y < 0) return false;
    if(x > n || y > m) return false;
    return true;
}
int main()
{
    int xs,ys,xf,yf,d,x,y,val;
    string S;
    fin >> n >> m;
    for (i = 0; i < n; ++i)
    {
        fin >> S;
        for (j = 0; j < m; ++j)
        {
            switch(S[j])
            {
            case 'D':
                {
                    q.push_back(make_pair(i,j));
                    a[i][j] = 1;
                    break;
                }
            case '*':
                {
                    a[i][j] = -1;
                    break;
                }
            case 'I':
                {
                    xs = i;
                    ys = j;
                    a[i][j] = 0;
                    break;
                }
            case 'O':
                {
                    xf = i;
                    yf = j;
                    a[i][j] = 0;
                    break;
                }
            case '.':
                {
                    a[i][j] = 0;
                    break;
                }
            }
        }
    }
    while(!q.empty())
    {
        i = q.front().f;
        j = q.front().s;
        q.pop_front();
        for(d = 0; d < 4; ++d)
        {
            x = i + dx[d];
            y = j + dy[d];
            if ( valid(x,y) && !a[x][y])
            {
                a[x][y] = a[i][j] + 1;
                q.push_back(make_pair(x,y));
            }
        }
    }
    dp[xs][ys] = a[xs][ys];
    q.push_back(make_pair(xs,ys));
    while(!q.empty())
    {
        i = q.front().f;
        j = q.front().s;
        q.pop_front();
        for(d = 0; d < 4; ++d)
        {
            x = i + dx[d];
            y = j + dy[d];
            val = min(a[x][y],dp[i][j]);
            if ( valid(x,y) && val > dp[x][y])
            {
                dp[x][y] = val;
                q.push_back(make_pair(x,y));
            }
        }
    }
    if(dp[xf][yf] > 1)
        fout << dp[xf][yf] - 1;
    else
        fout << -1;
    return 0;
}