Cod sursa(job #124071)

Utilizator DranaXumAlexandru Dumitru Paunoiu DranaXum Data 18 ianuarie 2008 00:03:09
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.77 kb
#include<stdio.h>
#define MAXCOADA 1000*1000

FILE *fin2=freopen("barbar.in","r",stdin);
FILE *fout=freopen("barbar.out","w",stdout);

struct poz
{
    int x;
    int y;
};

poz Coada[MAXCOADA*2+1];
poz Coada2[MAXCOADA*2+1];
int n,col,fx,fy;
int fin,m[1001][1001],m1[1001][1001];
int fin1;
void citeste()
{
    int i,j;
    i=1; j=0;
    scanf("%d%d\n",&n,&col);
    while(!feof(fin2))
    {
        char c;
        scanf("%c",&c);
        if(c=='\n'){if(j){ i++; j=0;}}
        else
        {
            j++;
            switch(c)
            {
                case '.':
                    m[i][j]=-1;
                    m1[i][j]=-1;
                    break;
                case 'D':
                    m[i][j]=-2;
                    m1[i][j]=0;
                    Coada2[fin1].y=i;
                    Coada2[fin1++].x=j;
                    break;
                case '*':
                    m[i][j]=-3;
                    m1[i][j]=-3;
                    break;
                case 'I':
                    m[i][j]=0;
                    m1[i][j]=0;
                    Coada[fin].y=i;
                    Coada[fin].x=j;
                    Coada2[fin1].y=i;
                    Coada2[fin1++].x=j;
                    break;
                case 'O':
                    m[i][j]=-1;
                    m1[i][j]=-1;
                    fy=i;
                    fx=j;
                    break;
            }
        }
    }    
    fin1--;
    fclose(fin2);
}

void bordeaza()
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        m[i][0]=-2;
        m[i][col+1]=-2;
    }
    for(j=1;j<=col;j++)
    {
        m[0][j]=-2;
        m[n+1][j]=-2;
    }
}

int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};
void rezolva()
{
    bordeaza();
    int ini=0;
    int ini1; ini1=0; 
    poz x,y,x1,y1;
    while(ini<=fin && m[fy][fx]==-1)
    {
        x=Coada[ini++];
        x1=Coada2[ini1++];
        for(int i=1;i<=4;i++)
        {
            y.y=x.y+dy[i];
            y.x=x.x+dx[i];
            
            y1.y=x1.y+dy[i];
            y1.x=x1.x+dx[i];
            if(m[y.y][y.x]==-1 && m[y.y][y.x]>-2)
            {
                m[y.y][y.x]=1+m[x.y][x.x];
                Coada[++fin]=y;
            }
            if(m1[y1.y][y1.x]==-1 && m1[y1.y][y1.x]>-2)
            {
                m1[y1.y][y1.x]=1+m1[x1.y][x1.x];
                Coada2[++fin1]=y1;
            }
        }
    }
}

int check(int i,int j)
{
    int x1,x2;
    int ret=2;
    x1=x2=j;
    while(x1>1 || x2<col)
    {
        if(x1>1)x1--;
        if(x2<col)x2++;
        if((m1[i][x1]==0 || m1[i][x2]==0) && ret==2)
        {
            ret=1;
        }
        if((m[i][x1]==-3 || m1[i][x2]==-3) && ret==2)
        {
            ret=0;
            break;
        }
    }
    int y1,y2;
    y1=y2=i;
    if(ret!=1){
        ret=2;
        while(y1>1 || y2<col)
        {
            if(y1>1)y1--;
            if(y2<col)y2++;
            if((m1[y1][j]==0 || m1[y2][j]==0) && ret==2)
            {
                ret=1;
            }
            if((m[y1][j]==-3 || m1[y2][j]==-3) && ret==2)
            {
                ret=0;
                break;
            }
        }
    }
    return ret;
}
void afiseaza()
{
    int i=fy;
    int j=fx;
    int max=m1[i][j];
    while(m[i][j]!=0)
    {
        for(int k=1;k<=4;k++)
        {
            if(m[i][j]==m[i+dy[k]][j+dx[k]]+1)
            {
                i=i+dy[k];
                j=j+dx[k];
                if(max<m1[i][j] && check(i,j)==1)
                    max=m1[i][j];
            }
        }
    }
    printf("%d ",max);
    fclose(fout);
}

int main()
{
    citeste();
    rezolva();
    afiseaza();
    return 0;
}