Cod sursa(job #792741)

Utilizator cat_red20Vasile Ioana cat_red20 Data 29 septembrie 2012 16:30:52
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <stdio.h>
#include<string.h>
#define MAX 1000001
int m,n,a[1002][1002],dr[1002][1002],c[2][MAX],xi,yi,xf,yf,u=0,viz[1001][1001],mb;
int dx[4]={0,0,1,-1}, dy[4]={-1,1,0,0};
FILE *fin,*fout;

void citire()
{
    char ch;
    fin=fopen("barbar.in","r");
    fscanf(fin,"%d %d\n",&m,&n);
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            fscanf(fin,"%c",&ch);
            dr[i][j]=MAX;
            if(ch=='D')
            {
                u++;
                c[0][u]=i;
                c[1][u]=j;
                a[i][j]=2;
                dr[i][j]=0;
            }
            else
            if(ch=='*')
                a[i][j]=MAX;
            else
            if(ch=='I')
            {
                a[i][j]=1;
                xi=i;
                yi=j;
            }
            else
            if(ch=='O')
                a[i][j]=3;
            else a[i][j]=0;
        }
        fscanf(fin,"%c",&ch);
    }

    for(int i=0;i<=m+1;i++)
    {
        a[i][0]=a[i][n+1]=MAX;
        dr[i][0]=dr[i][n+1]=0;
    }
    for(int i=0;i<=n+1;i++)
    {
        a[0][i]=a[m+1][i]=MAX;
        dr[0][i]=dr[m+1][i]=0;
    }
}

void dragoni()
{
    int p=1,l,cc;

    while(p<=u)
    {
        l=c[0][p];
        cc=c[1][p];
        for(int i=0;i<=3;i++)
        {
            if(a[l+dx[i]][cc+dy[i]]!=MAX && dr[l][cc]+1<dr[l+dx[i]][cc+dy[i]])
            {
                u++;
                c[0][u]=l+dx[i];
                c[1][u]=cc+dy[i];
                dr[l+dx[i]][cc+dy[i]]=dr[l][cc]+1;
            }
        }
        p++;
    }

}

int coada(int m)
{
    int p=1,u=1,l,cc;
    memset(viz,0,sizeof(viz));
    c[0][p]=xi;
    c[1][p]=yi;
    viz[xi][yi]=1;
    while(p<=u)
    {
        l=c[0][p];
        cc=c[1][p];
        for(int i=0;i<=3;i++)
        {
            if(viz[l+dx[i]][cc+dy[i]]==0 && dr[l+dx[i]][cc+dy[i]]>=m && a[l+dx[i]][cc+dy[i]]!=MAX)
            {
                viz[l+dx[i]][cc+dy[i]]=1;
                u++;
                c[0][u]=dx[i]+l;
                c[1][u]=dy[i]+cc;
                if(a[l+dx[i]][cc+dy[i]]==3)
                return 1;
            }
        }
        p++;
    }
    return 0;
}

void cautare()
{
    int p=0,u=MAX-1,m;
    while(p<=u)
    {
        m=(p+u)/2;
        int k=coada(m);
        if(k==1)
        {
            mb=m;
            p=m+1;
        }
        else
            u=m-1;
    }
}

void afisare()
{
    fout=fopen("barbar.out","w");
    if(mb==0)
    mb=-1;
    fprintf(fout,"%d",mb);
    fclose(fout);
}

int main()
{
    citire();
    dragoni();
    cautare();
    afisare();
return 0;
}