Cod sursa(job #2591031)

Utilizator amalia.gemanGeman Aamalia amalia.geman Data 29 martie 2020 15:39:41
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, mat[1001][1001], a[1001][1001];
int li, ci, lf, cf;
int ul, pr=1;
int dl[]={-1,0,1,0};
int dc[]={0,1,0,-1};

struct celula
{
   int x, y;
}v[1000001];

void Read()
{
    char c;
    fin >> n >> m;
    fin.get();
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            fin >> c;
            if(c == '.') mat[i][j]=0;
            else
                if(c == '*') mat[i][j] = -1;
            else
                if(c == 'D')
            {
                 mat[i][j] = -2;
                 v[++ul].x=i;
                 v[ul].y=j;
            }
            else if(c=='I') mat[i][j] = -3, li=i, ci=j;
            else mat[i][j] = -4, lf=i, cf=j;
        }
       fin.get();
    }
}

void Lee()
{
    int l, c, lv, cv;
    while(pr<=ul)
    {
        l = v[pr].x;
        c = v[pr].y;
        pr++;
        for(int i=0; i<4; i++)
        {
            lv = l + dl[i];
            cv = c + dc[i];
            if(lv>=1 && lv<=n && cv>=1 && cv<=m)
                if(mat[lv][cv]==0)
                {
                    if(mat[l][c] == -2)
                        mat[lv][cv] = 1;
                    else mat[lv][cv] = mat[l][c] + 1;
                    ul++;
                    v[ul].x = lv;
                    v[ul].y = cv;
                }
        }
    }
}

void Reinitializare()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) a[i][j] = 0;
}

int Traseu(int x)
{
    int lv, cv, l, c;
    pr=ul=1;
    v[1].x = li;
    v[1].y = ci;
    while(pr<=ul)
    {
        l = v[pr].x;
        c = v[pr].y;
        pr++;
        for(int i=0; i<4; i++)
        {
            lv = l + dl[i];
            cv = c + dc[i];
            if(lv>=1 && lv<=n && cv>=1 && cv<=m)
                if(a[lv][cv] == 0)
                    if(mat[lv][cv] >= x)
                    {
                        ul++;
                        v[ul].x = lv;
                        v[ul].y = cv;
                        a[lv][cv]=1;
                    }

                    else
                        if(mat[lv][cv] == -4)
                            return 1;
        }
    }
    Reinitializare();
    return 0;
}

int CB()
{
    int st, dr, mij, sol=-1;
    st = 1;
    dr = 3000;
    while(st<=dr)
    {
        mij = (st+dr)/2;
        if(Traseu(mij))
        {
            sol = mij;
            st = mij+1;
        }
        else dr = mij-1;
    }
    return sol;
}

int main()
{
    Read();
    Lee();
    fout << CB();
    /*
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        fout<<mat[i][j]<<" ";
    fout<<"\n";
    }
    */


    return 0;
}