Cod sursa(job #3254695)

Utilizator oliv_1Bostinescu Octavian oliv_1 Data 8 noiembrie 2024 15:40:58
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <fstream>
#include <queue>
using namespace std;
queue <pair<int,int>>q;
bool drum[1005][1005],viz[1005][1005];
int ras[1005][1005];
int n,m,istart,jstart,ifinish,jfinish;
void leedragon()
{
    while(q.size()>0)
    {
        int x=q.front().first,y=q.front().second;
        q.pop();
        if(drum[x+1][y]==0&&viz[x+1][y]==0)
        {
           viz[x+1][y]=1;
           ras[x+1][y]=ras[x][y]+1;
           q.push(make_pair(x+1,y));
        }
          if(drum[x-1][y]==0&&viz[x-1][y]==0)
        {
           viz[x-1][y]=1;
           ras[x-1][y]=ras[x][y]+1;
           q.push(make_pair(x-1,y));
        }
          if(drum[x][y+1]==0&&viz[x][y+1]==0)
        {
           viz[x][y+1]=1;
           ras[x][y+1]=ras[x][y]+1;
           q.push(make_pair(x,y+1));
        }
        if(drum[x][y-1]==0&&viz[x][y-1]==0)
        {
           viz[x][y-1]=1;
           ras[x][y-1]=ras[x][y]+1;
           q.push(make_pair(x,y-1));
        }


    }
}
int daiculee(int t)
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        viz[i][j]=0;
    q.push(make_pair(istart,jstart));
    viz[istart][jstart]=1;
    while(q.size()>0)
    {
             int x=q.front().first,y=q.front().second;
        q.pop();
        if(drum[x+1][y]==0&&viz[x+1][y]==0&&ras[x+1][y]>=t)
        {
           viz[x+1][y]=1;

           q.push(make_pair(x+1,y));
        }
          if(drum[x-1][y]==0&&viz[x-1][y]==0&&ras[x-1][y]>=t)
        {
           viz[x-1][y]=1;

           q.push(make_pair(x-1,y));
        }
          if(drum[x][y+1]==0&&viz[x][y+1]==0&&ras[x][y+1]>=t)
        {
           viz[x][y+1]=1;

           q.push(make_pair(x,y+1));
        }
        if(drum[x][y-1]==0&&viz[x][y-1]==0&&ras[x][y-1]>=t)
        {
           viz[x][y-1]=1;

           q.push(make_pair(x,y-1));
        }
    }
  return viz[ifinish][jfinish];
}
int cautbin()
{
    int pas=1<<20,raspuns=0;
    while(pas>0)
    {
        if(ras[istart][jstart]>=raspuns+pas&&daiculee(pas+raspuns)==1)
            raspuns+=pas;
        pas/=2;
    }
    if(raspuns==0)
        raspuns--;
    return raspuns;
}
int main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    char ch;
    cin>>n>>m;
    for(int i=0;i<=n;i++)
        drum[i][0]=1,drum[i][m+1]=1;
    for(int j=0;j<=m;j++)
        drum[0][j]=1,drum[n+1][j]=1;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin>>ch;
            if(ch=='*')
                drum[i][j]=1;
            else if(ch=='D')
                drum[i][j]=1,q.push(make_pair(i,j)),viz[i][j]=1;
            else if(ch=='I')
                istart=i,jstart=j;
            else if(ch=='O')
                ifinish=i,jfinish=j;


        }
    }
    leedragon();
    cout<<cautbin();
    return 0;
}