Cod sursa(job #1750928)

Utilizator tanasaradutanasaradu tanasaradu Data 31 august 2016 14:42:16
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <bits/stdc++.h>
#define infinit 10000000
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[1005][1005],b[1005][1005],n,m,c[1005][1005],xs,ys,xd,yd;
queue<pair<int,int> >st;
void Citire()
{
    int i,j;
    char x;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            fin>>x;
            if(x=='D')
                a[i][j]=1;
            else if(x=='*')
                a[i][j]=-1;
            else if(x=='I')
            {
                xs=i;
                ys=j;
            }
            else if(x=='O')
            {
                xd=i;
                yd=j;
            }
        }
}
void Bordare()
{
    int i;
    for(i=0;i<=m+1;i++)
        a[0][i]=a[n+1][i]=-1;
    for(i=0;i<=n+1;i++)
        a[i][0]=a[i][m+1]=-1;
}
void Initializare()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            b[i][j]=infinit;

}
void Initializare1()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            c[i][j]=infinit;
}
void Lee1()
{
    int i,j,dx[]={1,-1,0,0},x,y,k;
      int dy[]={0,0,-1,1};
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        if(a[i][j]==1)
        {
            st.push(make_pair(i,j));
            b[i][j]=0;
        }
    while(!st.empty())
    {
        i=st.front().first;
        j=st.front().second;
        st.pop();
        for(k=0;k<4;k++)
        {
            x=i+dx[k];
            y=j+dy[k];
            if(a[x][y]!=1 and a[x][y]!=-1 and b[x][y]>b[i][j]+1)
            {
                b[x][y]=b[i][j]+1;
                st.push(make_pair(x,y));
            }
        }
    }
}
int Lee2(int p)
{
   int i,j,dx[]={1,-1,0,0},x,y,k;
      int dy[]={0,0,-1,1};
    st.push(make_pair(xs,ys));
    c[xs][ys]=0;
    if(b[xs][ys]<p)
        return 0;
    while(!st.empty())
    {
        i=st.front().first;
        j=st.front().second;
        st.pop();
        for(k=0;k<4;k++)
        {
            x=i+dx[k];
            y=j+dy[k];
            if(b[x][y]>=p and a[x][y]!=-1 and c[x][y]>c[i][j]+1)
            {
                c[x][y]=c[i][j]+1;
                st.push(make_pair(x,y));
            }
        }
    }
    if(c[xd][yd]==infinit)
       return  0;
    return 1;
}
int CautBin()
{
    int st=0,dr=10000000,mij,poz=-1;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(Lee2(mij)==1)
        {
              poz=mij;
              st=mij+1;
            Initializare1();
        }
        else
        {
            dr=mij-1;
            Initializare1();
        }
    }
    return poz;
}
int main()
{
    Citire();
    Bordare();
    Initializare();
    Initializare1();
    Lee1();
    fout<<CautBin()<<"\n";
    return 0;
}