Cod sursa(job #897315)

Utilizator annaST97Stan Ana Maria annaST97 Data 27 februarie 2013 19:56:38
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.43 kb
#include<cstdio>
#include<cstring>

#define BIG 1<<30
#define MAX_SIZE 1005
#define GOOD 3
#define min(a,b) ((a)<(b)?(a):(b))

FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");

using namespace std;


int a[MAX_SIZE][MAX_SIZE],l_dr[1000000],c_dr[1000000];
int b[MAX_SIZE][MAX_SIZE];
int start_i,start_j;
bool viz[MAX_SIZE][MAX_SIZE];
int dx[]={-1,1,0,0},dy[]={0,0,1,-1};
int N,M,pos1,pos2;
char ch;
int result;
int q;




void read  ( void )
{
    fscanf(f,"%d%d",&N,&M);
        fscanf(f,"%c",&ch);
    for( int i(1); i <= N; ++i )
    {
        for( int ii(1); ii <= M ; ++ii)
        {
            fscanf(f,"%c",&ch);
            b[i][ii]=BIG;
            if(ch=='.')
             continue;
             if(ch == 'I' )
             {
                 a[i][ii]=1;
                 start_i=i;
                 start_j=ii;
                 continue;
             }
             if(ch == '*' )
             {
                 a[i][ii]=BIG;
                 continue;
             }
             if(ch == 'D' )
             {
                 a[i][ii]=2;
                 b[i][ii]=0;
                 l_dr[++q]=i;
                 c_dr[q]=ii;
             }
             if(ch == 'O' )
             {
                  a[i][ii]=3;

             }
        }
            fscanf(f,"%c",&ch);

        }







}
inline void mod ( void )
{

      for(int i=0;i<=N+1;i++)
    {
        a[i][0]=a[i][M+1]=BIG;
        b[i][0]=b[i][M+1]=0;
    }
    for(int i=0;i<=M+1;i++)
    {
        a[0][i]=a[N+1][i]=BIG;
        b[0][i]=b[N+1][i]=0;
    }







}
void bfs( void )
{



    int x,y,xnou,ynou;


     for(int i(1); i <= q; ++i)
     {
         x=l_dr[i];
         y=c_dr[i];


         for(int ii(0); ii <= 3; ++ii )
         {
             xnou=x+dx[ii];
             ynou=y+dy[ii];

             if( a[xnou][ynou]!=BIG &&  b[x][y]+1 < b[xnou][ynou]  )
             {
                 b[xnou][ynou]=b[x][y]+1;
                 q++;
                 l_dr[q]=xnou;
                 c_dr[q]=ynou;


             }





         }





     }




}

int bfs2( int m  )
{
    int k=1;

    memset(viz,0,sizeof(viz));
    l_dr[1]=start_i;
    c_dr[1]=start_j;
    if(b[start_i][start_j] < m)
        return 0;
    viz[l_dr[1]][c_dr[1]]=1;
    int x,y,xnou,ynou;
    for(int i(1); i <= k; ++i )
    {
        x=l_dr[i];
        y=c_dr[i];

        for(int ii(0); ii <= 3; ++ii)
        {
            xnou=x+dx[ii];
            ynou=y+dy[ii];
            if(viz[xnou][ynou] == 0 && a[xnou][ynou]!=BIG && b[xnou][ynou] >= m)
            {


                viz[xnou][ynou]=1;
                ++k;
                l_dr[k]=xnou;
                c_dr[k]=ynou;
                if(a[xnou][ynou] == 3 )
                    return 1;

            }
        }
    }

    return 0;

}

void solve ( void )
{
    int left=0,right=1000000;

    while( left <= right )
    {
        int mid=(left+right)/2;

        if( bfs2(mid)  ==  1  )
        {
            result=mid;
            left=mid+1;
            continue;
        }
        right=mid-1;





    }



}
inline void write( void )
{
    if(result == 0)
        fprintf(g,"-1");

        else
    fprintf(g,"%d",result);
    fclose(g);


}

int main()
{
    read();
    mod();
    bfs();
    solve();
    write();
    return 0;
}