Cod sursa(job #2144287)

Utilizator VladAfrasineiAfrasinei VladAfrasinei Data 26 februarie 2018 17:37:59
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
queue <int> C1,C2;
int a[1005][1005],n,m,li,ci,lf,cf,maxi,d[1005][1005];
char x;
int main()
{
    int i,j,l,c,lv,cv;
    int ok,mij,st,dr;
    int dl[4]={-1,0,1,0};
    int dc[4]={0,1,0,-1};
fin>>n>>m;
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        d[i][j]=999999;
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    {
        fin>>x;
        if(x=='I')
        {
            li=i;
            ci=j;
            a[i][j]=1;
        }
        else
            if(x=='O')
            {
            lf=i;
            cf=j;
            a[i][j]=1;
            }
            else
                if(x=='D'||x=='*')
                    {a[i][j]=-1;
                        if(x=='D')
                        {
                            C1.push(i);
                            C2.push(j);
                            d[i][j]=0;
                        }
                    }
                else
                    a[i][j]=1;
    }
for (i=0;i<=n+1;++i)
        a[i][0]=a[i][m+1]=d[i][0]=d[i][m+1]=-1;
    for (j=0;j<=m+1;++j)
        a[0][j]=a[n+1][j]=d[0][j]=d[n+1][j]=-1;
while(!C1.empty())
{
    l=C1.front();
    C1.pop();
    c=C2.front();
    C2.pop();
    for(i=0;i<4;i++)
    {
        lv=l+dl[i];
        cv=c+dc[i];
        if(a[lv][cv]!=-1&&d[l][c]+1<d[lv][cv])
        {
            d[lv][cv]=d[l][c]+1;
            C1.push(lv);
            C2.push(cv);
        }
    }
}
ok=1;
st=1;
dr=min(n,m);
while(st<=dr)
{
       mij=(st+dr)/2;
       if(d[li][ci]>=mij)
       {
           C1.push(li);
           C2.push(ci);
           a[li][ci]=2;
           ok=0;
           while(!C1.empty())
           {
               l=C1.front();
               C1.pop();
               c=C2.front();
               C2.pop();
               for(i=0;i<4;i++)
               {
                   lv=l+dl[i];
                   cv=c+dc[i];
                   if(a[lv][cv]==1&&d[lv][cv]>=mij)
                   {
                       a[lv][cv]=2;
                       if(lv==lf&&cv==cf)
                            {   ok=1;
                                maxi=max(maxi,mij);
                            }
                       else
                       {
                           C1.push(lv);
                           C2.push(cv);
                       }
                   }
               }

           }
           if(ok==0)
              dr=mij-1;
           else
            st=mij+1;
         for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                if(a[i][j]==2)
                    a[i][j]=1;
     }
     else
        dr=mij-1;
}
fout<<maxi;
    return 0;
}