Cod sursa(job #2112213)

Utilizator Mihnea_BranzeuMihnea Branzeu Mihnea_Branzeu Data 23 ianuarie 2018 11:10:53
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int dl[]= {-1,0,1,0};
const int dc[]= {0,1,0,-1};
const int N=1002;

int d[N][N],n,m;
bool accesibil[N][N];

struct poz
{
    int l,c;
};
poz q[N*N],barbar,iesire;

bool sepoate(int distanta)
{
    int st,dr,i,j;
    st=0;
    dr=-1;
    poz x,y;
    q[++dr]=barbar;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            accesibil[i][j]=false;
    accesibil[barbar.l][barbar.c] = true;
    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(d[y.l][y.c]>=distanta && !accesibil[y.l][y.c])
            {
                q[++dr]=y;
                accesibil[y.l][y.c] = true;
            }

        }
    }
    return accesibil[iesire.l][iesire.c];

}

const int L=9;
int main()
{
    int i,j,st,dr,vmin;
    st=0;
    dr=-1;
    poz x,y;
    char t;
    //citire
    fin>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            fin>>t;
            if(t=='.')
            {
                d[i][j]=-1;
            }
            else if(t=='*')
            {
                d[i][j]=-2;
            }
            else if(t=='D')
            {
                d[i][j]=0;
                q[++dr]=(poz)
                {
                    i,j
                };
            }
            else if(t=='I')
            {
                barbar=(poz)
                {
                    i,j
                };
                d[i][j]=-1;
            }
            else if(t=='O')
            {
                iesire=(poz)
                {
                    i,j
                };
                d[i][j]=-1;
            }
        }
    //bordare
    for(i=0; i<=n+1; i++)
        d[i][0]=d[i][m+1]=-2;
    for(j=0; j<=m+1; j++)
        d[0][j]=d[n+1][j]=-2;

    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(d[y.l][y.c]==-1)
            {
                q[++dr]=y;
                d[y.l][y.c]=1+d[x.l][x.c];
            }
        }
    }
    /* for(i=0; i<=n+1; i++)
     {
         for(j=0; j<=m+1; j++)
             fout<<d[i][j]<<" ";
         fout<<"\n";
     }*/
    int r,pas;
    pas=1<<L;
    r=0;
    while(pas!=0)
    {
        if(sepoate(r+pas)) r+=pas;
        pas/=2;
    }
    fout<<r;
    return 0;
}