Cod sursa(job #3239169)

Utilizator petric_mariaPetric Maria petric_maria Data 2 august 2024 17:49:59
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m, i, j, a[1005][1005], d[1005][1005], viz[1005][1005], x, y, x2, y2, i2, j2, ans;
char c[1005];
int vx[] = {-1, 0, 1, 0};
int vy[] = {0, -1, 0, 1};

queue< pair<int, int> > q;

bool ok(int i, int j)
{
    return i>=1 && i<=n && j>=1 && j<=m;
}
void rezolva(int i2, int j2, int val)
{
    int iaux, jaux;
    viz[i2][j2]=1;

    for(int i=0; i<4; ++i)
    {
        iaux = i2 + vx[i];
        jaux = j2 + vy[i];
        if(ok(iaux, jaux) && a[iaux][jaux]==0 && viz[iaux][jaux]==0 && d[iaux][jaux]-1 >= val)
            rezolva(iaux, jaux, val);
    }
}

int main()
{
    f>>n>>m;
    f.get();
    for(i=1; i<=n; ++i)
    {
        f.getline(c, 1005);
        for(j=0; j<m; ++j)
        {
            if(c[j]=='.')  a[i][j+1]=0;
            if(c[j]=='*')  a[i][j+1]=1;
            if(c[j]=='I')
            {
                a[i][j+1]=0;  x=i;  y=j+1;
            }
            if(c[j]=='O')
            {
                a[i][j+1]=0;  x2=i;  y2=j+1;
            }
            if(c[j]=='D')
            {
                a[i][j+1]=0;  d[i][j+1]=1;
                q.push( make_pair(i, j+1) );
            }
        }
    }

    //matricea de distante
    while(!q.empty())
    {
        i2 = q.front().first;
        j2 = q.front().second;
        int iaux, jaux;
        for(i=0; i<4; ++i)
        {
            iaux = i2 + vx[i];
            jaux = j2 + vy[i];
            if(ok(iaux, jaux) && a[iaux][jaux]==0 && d[iaux][jaux]==0)
            {
                q.push(make_pair(iaux, jaux));
                d[iaux][jaux] = d[i2][j2]+1;
            }
        }
        q.pop();

    }

    //cautare binara
    ans=-1;
    int st=0, dr=n+m, mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(mij <= d[x][y]-1)
            rezolva(x, y, mij);
        if(viz[x2][y2]==1)
        {
            ans=mij;
            st=mij+1;
        }
        else dr=mij-1;
        //cout<<mij<<' '<<ans<<endl;
        for(i=1; i<=n; ++i)
            for(j=1; j<=m; ++j)  viz[i][j]=0;

    }
    g<<ans;
    return 0;
}