Cod sursa(job #3203919)

Utilizator maryyMaria Ciutea maryy Data 15 februarie 2024 01:27:11
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");

const int nmax=1001;
int n, m, xs, ys, xf, yf;
char a[nmax+1][nmax+1];
int drag[nmax+1][nmax+1];
int ox[]={-1, 1, 0, 0};
int oy[]={0, 0, -1, 1};
queue <pair<int, int>> q;
bool InMatrix(int x, int y)
{
    return (x>=1 && x<=n && y>=1 && y<=m);
}
void LeeDragoni()//pt fiecare casuta stiu distanta minima pana la un dragon
{
    int x1, y1, x2, y2;
    while(!q.empty())
    {
        x1=q.front().first; y1=q.front().second;
        q.pop();
        for(int dir=0; dir<=3; dir++)
        {
            x2=x1+ox[dir]; y2=y1+oy[dir];
            if(InMatrix(x2, y2) && a[x2][y2]!='*' && a[x2][y2]!='D' && (drag[x2][y2]>drag[x1][y1]+1 || drag[x2][y2]==0))
            {
                drag[x2][y2]=drag[x1][y1]+1;
                q.push({x2, y2});
            }
        }
    }
}

bool LeeAjunge(int dmax)//sa nu se apropie de dragoni decat cu maxim dmax
{
    bool aj[nmax+1][nmax+1]={};
    while(!q.empty()) q.pop();
    q.push({xs, ys});
    aj[xs][ys]=1;
    int x1, y1, x2, y2;
    while(!q.empty())
    {
        x1=q.front().first; y1=q.front().second;
        q.pop();
        for(int dir=0; dir<=3; dir++)
        {
            x2=x1+ox[dir]; y2=y1+oy[dir];
            if(InMatrix(x2, y2) && (a[x2][y2]!='*') && aj[x2][y2]==0 && drag[x2][y2]>=dmax)
            {
                aj[x2][y2]=1;
                if(x2==xf && y2==yf)
                    return 1;
                q.push({x2, y2});
            }
        }
    }
//    for(int i=1; i<=n; i++)
//    {
//        for(int j=1; j<=m; j++)
//        {
//            out<<aj[i][j]<<" ";
//        }
//        out<<'\n';
//    }
    return 0;
}
int main()
{
    in>>n>>m;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            in>>a[i][j];
            if(a[i][j]=='D')
            {
                q.push({i, j});
            }
            if(a[i][j]=='I')
            {
                xs=i; ys=j;
            }
            if(a[i][j]=='O')
            {
                xf=i; yf=j;
            }
        }
    }
    LeeDragoni();
//    for(int i=1; i<=n; i++)
//    {
//        for(int j=1; j<=n; j++)
//        {
//            out<<drag[i][j]<<" ";
//        }
//        out<<'\n';
//    }
    int rez=0;
    int st=0, dr=n+m, mijl;//cautare binara pe raspuns
    //out<<LeeAjunge(1); return 0;
    bool poate;
    while(st<=dr)
    {
        mijl=(st+dr)/2;
        poate=LeeAjunge(mijl);//poate ajunge la destinatie fiind departe de dragoni cu mijl
        //out<<mijl<<" "<<poate<<"\n";
        if(poate==1)
        {
            rez=mijl;
            st=mijl+1;
        }
        else
        {
            dr=mijl-1;
        }
    }
    out<<rez;
}