Cod sursa(job #1978296)

Utilizator IsacLucianIsac Lucian IsacLucian Data 7 mai 2017 13:08:52
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <bits/stdc++.h>
#define nmax 1001
#define oo 1000000
using namespace std;
char a[nmax][nmax];
int dragoni[nmax][nmax],drum[nmax][nmax],n,m,xi,yi,xf,yf;
queue<pair<int,int> >q;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void Citire()
{
    int i,j;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>(a[i]+1);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(a[i][j]=='I')
    {
        xi=i;
        yi=j;
    }
    else if(a[i][j]=='O')
    {
        xf=i;
        yf=j;
    }
}
inline bool Verificare(int x,int y)
{
    if(1<=x && x<=n && 1<=y && y<=m)
        return true;
    return false;
}
inline void Initializare()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            dragoni[i][j]=oo;
}
inline void Initializare1()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            drum[i][j]=oo;
}
void Lee()
{
    int i,j,x,y,k;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(a[i][j]=='D')
    {
        q.push(make_pair(i,j));
        dragoni[i][j]=1;
    }
    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(Verificare(x,y) && a[x][y]!='*' && dragoni[x][y]>dragoni[i][j]+1)
            {
                dragoni[x][y]=dragoni[i][j]+1;
                q.push(make_pair(x,y));
            }
        }
    }
    /*for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            fout<<dragoni[i][j]<<" ";
            fout<<"\n";
    }
    */
}
inline bool Lee_Binar(int dist)
{
    int i,j,x,y,k;
    if(dragoni[xi][yi]<=dist)
        return false;
    Initializare1();
    q.push(make_pair(xi,yi));
    drum[xi][yi]=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(Verificare(x,y) && a[x][y]!='*' && drum[x][y]>drum[i][j]+1 &&   dragoni[x][y]>dist)
            {
                drum[x][y]=drum[i][j]+1;
                q.push(make_pair(x,y));
            }
        }
    }
    if(drum[xf][yf]!=oo)
        return true;
    return false;
}
inline int Caut_Bin()
{
    int st=1,dr=oo,mij,poz=-1;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(Lee_Binar(mij))
        {
            poz=mij;
            st=mij+1;
        }
        else dr=mij-1;
    }
    return poz;
}
int main()
{
    Citire();
    Initializare();
    Lee();
    fout<<Caut_Bin()<<"\n";
    fin.close();
    fout.close();
    return 0;
}