Cod sursa(job #2295792)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 3 decembrie 2018 22:36:06
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <string>

#define N 1010
#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];
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
queue<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(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();
        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(make_pair(x,y));
            }
        }
    }
    dp[xs][ys] = a[xs][ys];
    q.push(make_pair(xs,ys));
    while(!q.empty())
    {
        i = q.front().f;
        j = q.front().s;
        q.pop();
        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(make_pair(x,y));
            }
        }
    }
    fout << -1;
    return 0;
}