Cod sursa(job #2162773)

Utilizator ikogamesIon Ceaun ikogames Data 12 martie 2018 13:48:05
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <bits/stdc++.h>
#define iKo 9999999
using namespace std;

ifstream fin ("barbar.in");
ofstream fout ("barbar.out");

int n,xs,ys,m,a[1005][1005],b[1005][1005],c[1005][1005],xos,yos;

queue< pair<int,int> > q;

int dx[]={-1,1,0, 0};
int dy[]={ 0,0,1,-1};

void Read()
{
    char ch;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            b[i][j]=iKo;
            fin>>ch;
            if(ch=='.') a[i][j]=0;
            else if(ch=='I') {xs=i;ys=j;}
            else if(ch=='*') a[i][j]=-1;
            else if(ch=='D') {q.push({i,j});b[i][j]=0;}
            else if(ch=='O') {xos=i;yos=j;}
        }
}
void Bord()
{
    for(int i=0;i<=n+1;i++)
        a[i][0]=a[i][m+1]=-1;
    for(int i=0;i<=m+1;i++)
        a[0][i]=a[n+1][i]=-1;
}
void LeeD()
{
    int i,j,x,y;
    while(!q.empty())
    {
        i=q.front().first;
        j=q.front().second;
        q.pop();
        for(int k=0;k<4;k++)
        {
            x=i+dx[k];
            y=j+dy[k];
            if(a[x][y]!=-1&&b[x][y]>b[i][j]+1)
            {
                b[x][y]=b[i][j]+1;
                q.push({x,y});
            }
        }
    }
}
void Init()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            c[i][j]=iKo;
}
int LeeB(int s)
{
    Init();
    int i,j,x,y,k;
    if(c[xs][ys]<s) return 0;
    q.push({xs,ys});
    c[xs][ys]=0;
    while(!q.empty())
    {
         i=q.front().first;
         j=q.front().second;
         q.pop();
         for(k=0;k<4;k++)
         {
             x=i+dx[k];
             y=j+dy[k];
             if(a[x][y] != -1 && c[x][y] > c[i][j] + 1 && b[x][y] >= s)
             {
                 c[x][y]=c[i][j]+1;
                 q.push({x,y});
             }
         }
    }
    if(c[xos][yos]==iKo) return 0;
    return 1;
}
void BinSearch()
{
    int st=0,dr = iKo,mij,ans;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(LeeB(mij)==1)
        {
            ans=mij;
            st=mij+1;
        }
        else
        dr=mij-1;
    }
    fout<<ans<<"\n";
}
int main()
{
    Read();
    Bord();
    LeeD();
    BinSearch();
    return 0;
}