Cod sursa(job #2764885)

Utilizator ana_madalina_18Radu Ana Madalina ana_madalina_18 Data 23 iulie 2021 10:05:22
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.98 kb
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
string v[1005];
int a[1005][1005],mat[1005][1005];
int r,c;
int dx[5]={-1,1,0,0}, dy[5]={0,0,-1,1};
struct pt_lee
{
    int linia,coloana,val;
};
bool verif(pt_lee x)
{
    return x.linia>0 && x.coloana>0 && x.linia<=r && x.coloana<=c;
}
queue <pt_lee> q;
void lee_dragoni()
{
    while(!q.empty())
    {
        for(int i=0;i<4;i++)
        {
            pt_lee vecin;
            vecin.linia=q.front().linia+dx[i];
            vecin.coloana=q.front().coloana+dy[i];
            if(verif(vecin) && a[vecin.linia][vecin.coloana]==0)
            {
                a[vecin.linia][vecin.coloana]=a[q.front().linia][q.front().coloana]+1;
                q.push(vecin);
            }
        }
        q.pop();
    }

}
void lee(int valoare, pt_lee coord_inceput)
{
    memset(mat,0,sizeof mat);
    q.push(coord_inceput);
    while(!q.empty())
    {
        for(int i=0;i<4;i++)
        {
            pt_lee vecin;
            vecin.linia=q.front().linia+dx[i];
            vecin.coloana=q.front().coloana+dy[i];
            if(verif(vecin) && a[vecin.linia][vecin.coloana]-1>=valoare && mat[vecin.linia][vecin.coloana]==0)
            {
                mat[vecin.linia][vecin.coloana]=mat[q.front().linia][q.front().coloana]+1;
                q.push(vecin);
            }
        }
        q.pop();
    }
}
int cautare_binara(int st,int dr,pt_lee coord_inceput, pt_lee coord_sfarsit)
{
    int val=-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        lee(mij,coord_inceput);
        if(mat[coord_sfarsit.linia][coord_sfarsit.coloana]!=0)
        {
            st=mij+1;
            val=mij;
        }
        else
        {
            dr=mij-1;
        }
    }
    return val;
}
int main()
{
    ifstream fin("barbar.in");
    ofstream fout("barbar.out");
    fin>>r>>c;
    for(int i=1;i<=r;i++)
    {
        fin>>v[i];
    }
    pt_lee coord_inceput,coord_sfarsit;
    for(int i=1;i<=r;i++)
    {
        for(int j=0;j<c;j++)
        {
            if(v[i][j]=='.')
            {
                a[i][j+1]=0;
                mat[i][j+1]=0;
            }
            else if(v[i][j]=='*')
            {
                a[i][j+1]=-2;
                mat[i][j+1]=-2;
            }
            else if(v[i][j]=='D')
            {
                a[i][j+1]=1;
                mat[i][j+1]=-1;
                pt_lee x;
                x.linia=i;
                x.coloana=j+1;
                x.val=1;
                q.push(x);
            }
            else if(v[i][j]=='I')
            {
                coord_inceput.linia=i;
                coord_inceput.coloana=j;
            }
            else
            {
                coord_sfarsit.linia=i;
                coord_sfarsit.coloana=j;
            }
        }
    }
    lee_dragoni();
    int st=1,dr=r*c;
    fout<<cautare_binara(st,dr,coord_inceput,coord_sfarsit);
    return 0;
}