Cod sursa(job #821043)

Utilizator alexpascadiAlexandru Pascadi alexpascadi Data 21 noiembrie 2012 16:18:50
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <stdio.h>

using namespace std;

const int N=1005;
const int dlin[]={-1,1,0,0};
const int dcol[]={0,0,-1,1};
char v[N][N];
int d[N][N],dr[N][N];
int r,c;

struct element {int lin,col;};
element q[N*N],x,y,start,fin;

void lee(int obs)
{
    int p,u,i,k;
    p=0; u=1;

    while(p<u)
    {
        x=q[p++];
        for(i=0;i<4;i++)
        {
            k=x.lin+dlin[i];
            if(k>=0 && k<r) y.lin=k; else continue;
            k=x.col+dcol[i];
            if(k>=0 && k<c) y.col=k; else continue;
            if(d[y.lin][y.col]>=obs && dr[y.lin][y.col]==-1)
            {
                q[u++]=y;
                dr[y.lin][y.col]=1+dr[x.lin][x.col];
            }
        }
    }
}

int main()
{
    FILE *in,*out;
    in=fopen("barbar.in","r");
    out=fopen("barbar.out","w");
    int i,j,p,u,k,caut;
    long long obs;

    fscanf(in,"%d%d\n",&r,&c);
    for(i=0;i<r;i++)
        fgets(v[i],N,in);

    p=u=0;

    for(i=0;i<r;i++)
        for(j=0;j<r;j++)
        {
            if(v[i][j]=='.') d[i][j]=-1;
            if(v[i][j]=='*') d[i][j]=-2;
            if(v[i][j]=='D') {d[i][j]=0; q[u].lin=i; q[u].col=j; u++;}
            if(v[i][j]=='I') {d[i][j]=-1; start.lin=i; start.col=j;}
            if(v[i][j]=='O') {d[i][j]=-1; fin.lin=i; start.col=j;}
        }

    while(p<u)
    {
        x=q[p++];
        for(i=0;i<4;i++)
        {
            k=x.lin+dlin[i];
            if(k>=0 && k<r) y.lin=k; else continue;
            k=x.col+dcol[i];
            if(k>=0 && k<c) y.col=k; else continue;
            if(d[y.lin][y.col]==-1)
            {
                q[u++]=y;
                d[y.lin][y.col]=1+d[x.lin][x.col];
            }
        }
    }

    /*for(i=0;i<r;i++)
    {
        for(j=0;j<r;j++) fprintf(out,"%d ",d[i][j]);
        fprintf(out,"\n");
    }*/

    caut=0;
    for(obs=1<<19;obs;obs/=2)
    {
        //printf("%lld am ajuns aici\n",caut);
        q[0]=start;
        for(i=0;i<r;i++)
            for(j=0;j<c;j++)
                dr[i][j]=-1;
        dr[start.lin][start.col]=0;

        lee(caut+obs);
        if(dr[fin.lin][fin.col]!=-1) caut+=obs;
    }

    fprintf(out,"%lld",caut);

    return 0;
}