Cod sursa(job #2117583)

Utilizator vladstanciuVlad Stanciu vladstanciu Data 28 ianuarie 2018 23:08:30
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <fstream>
#include <cstring>
#include <iostream>

using namespace std;

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

const int N=1000;
char v[N][N];
int a[N][N];
int visited[N][N];
const int dl[]= {-1,0,1,0};
const int dc[]= {0,1,0,-1};
struct cord
{
    int l;
    int c;
};
cord q[N*N],p,o,x,y;
int r,c;

int sepoate(int super)
{
    int dr=-1,st=0,i,j;
    q[++dr]=p;

    for(i=1 ; i<=r ; i++)
    {
        for(j=1 ; j<=c ; j++)
        {
            visited[i][j]=0;
        }
    }
    visited[p.l][p.c]=1;
    while(st<=dr)
    {
        x=q[st++];
        for(i=0 ; i<4 ; i++)
        {
            y.l=x.l+dl[i];
            y.c=x.c+dc[i];

            if((a[y.l][y.c]>=super || a[y.l][y.c]==-3) && visited[y.l][y.c]==0)
            {
                q[++dr]=y;
                visited[y.l][y.c]++;
            }
        }
    }
    return visited[o.l][o.c];
}

int main()
{
    int i,j,dr=-1,st=0,mij,cst,cdr;
    in>>r>>c>>ws;
    for(i=1 ; i<=r ; i++)
    {
        in.getline(1+v[i],N);
        for(j=1 ; j<=c ; j++)
        {
            if(v[i][j]=='I')
            {
                a[i][j]=-2;
                p.l=i;
                p.c=j;
            }
            else if(v[i][j]=='D')
            {
                a[i][j]=0;
                dr++;
                q[dr].l=i;
                q[dr].c=j;
            }
            else if(v[i][j]=='*')
            {
                a[i][j]=0;
            }
            else if(v[i][j]=='.')
            {
                a[i][j]=-1;
            }
            else if(v[i][j]=='O')
            {
                a[i][j]=-3;
                o.l=i;
                o.c=j;
            }
        }
    }

    while(st<=dr)
    {
        x=q[st];
        st++;
        for(i=0 ; i<4 ; i++)
        {
            y.l=x.l+dl[i];
            y.c=x.c+dc[i];
            if(a[y.l][y.c]!=0)
            {
                if(a[y.l][y.c]==-1)
                {
                    a[y.l][y.c]=a[x.l][x.c]+1;
                    q[++dr]=y;
                }
                else if(a[y.l][y.c]>(a[x.l][x.c]+1))
                {
                    a[y.l][y.c]=a[x.l][x.c]+1;
                    q[++dr]=y;
                }
            }
        }

    }
    st=1;
    dr=r+c;
    while(st!=dr)
    {
        mij=st+dr;
        mij/=2;
        cst=st;
        cdr=dr;
        if(sepoate(mij)==0)
        {
            dr=mij;
        }
        if(sepoate(mij)==1)
        {
            st=mij;
        }
        if(st==cst && dr==cdr)
        {
            if(sepoate(st)==0)
            {
                st=dr;
            }
            else
            {
                dr=st;
            }
        }
    }
    out<<st;
    return 0;
}