Cod sursa(job #2480728)

Utilizator FastmateiMatei Mocanu Fastmatei Data 26 octombrie 2019 09:17:26
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

pair<int,int>v[1000005];
char a[1005][1005];
int b[1005][1005],n,m,k;
int xi,yi,xo,yo;
///b[i][j]= distanta minima posibila de la poz, (i,j)
///         la un dragon

bitset<1003>c[1003];

void Citire()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>(a[i]+1);
}

void Bordare()
{
    int i;
    for(i=0;i<=n+1;i++)
        a[i][0]=a[i][m+1]='*';
    for(i=0;i<=m+1;i++)
        a[0][i]=a[n+1][i]='*';
}

void Initial()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            if(a[i][j]=='I') {xi=i;yi=j;}
            if(a[i][j]=='O') {xo=i;yo=j;}
            if(a[i][j]=='D')
            {
                b[i][j]=0;
                k++;
                v[k]={i,j};///am retinut pozitiile de D
            }
            else b[i][j] = 2000000;
        }
}

void Distante()
{
    int i,j,x,y;
    while(k>0)
    {
        i=v[k].first;
        j=v[k].second;
        k--;
        ///nord
        x=i-1;
        y=j;
        if(a[x][y]!='*' && b[x][y]>1+b[i][j])
        {
            b[x][y]=1+b[i][j];
            k++;
            v[k]={x,y};
        }
        ///sud
        x=i+1;
        y=j;
        if(a[x][y]!='*' && b[x][y]>1+b[i][j])
        {
            b[x][y]=1+b[i][j];
            k++;
            v[k]={x,y};
        }
        ///est
        x=i;
        y=j+1;
        if(a[x][y]!='*' && b[x][y]>1+b[i][j])
        {
            b[x][y]=1+b[i][j];
            k++;
            v[k]={x,y};
        }
        ///vest
        x=i;
        y=j-1;
        if(a[x][y]!='*' && b[x][y]>1+b[i][j])
        {
            b[x][y]=1+b[i][j];
            k++;
            v[k]={x,y};
        }
    }
}

void Afisare()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            if(b[i][j]!=2000000) fout<<b[i][j]<<" ";
            else fout<<"x ";
        fout<<"\n";
    }
}

///Verific daca pot ajunge de la i la o
/// mergand doar pe valori mai mari sau egale decat val
void Fill(short i,short j,int val)
{
    if(a[i][j]!='*' && b[i][j]>=val && c[i][j]==0)
    {
        c[i][j]=1;
        Fill(i-1,j,val);
        Fill(i+1,j,val);
        Fill(i,j-1,val);
        Fill(i,j+1,val);
    }
}

void Rezolva()
{
    int i,j;
    for(i=b[xi][yi];i>=i;i--)
    {
        for(j=1;j<=n;j++)
            c[j].reset();
        ///incerc sa vad daca pot ajunge din (xi,yi)
        ///in (xo,yo) mergand doar pe valori >= i
        Fill(xi,yi,i);
        if(c[xo][yo]==1)
        {
            fout<<i<<"\n";
            fout.close();
            return;
        }
    }
    fout<<"-1\n";
    fout.close();
}

int main()
{
    Citire();
    Bordare();
    Initial();
    Distante();
    Rezolva();
    return 0;
}