Cod sursa(job #2059648)

Utilizator rares1012Rares Cautis rares1012 Data 7 noiembrie 2017 12:52:53
Problema Barbar Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <stdio.h>
#include <stdlib.h>

char v[1002][1002];

int dragoni[1000000][2];

char dirl[4]={-1,0,1,0};
char dirc[4]={0,1,0,-1};

int lee[1000000][2];

char marc[1001][1001];

int sl,sc,fl,fc;

void reset(){
    int i,j;
    for(i=1;i<11;i++)
        for(j=1;j<11;j++)
            marc[i][j]=0;
}

char check(int acc){
    int i=0,k=1,j;
    lee[0][0]=sl;
    lee[0][1]=sc;
    while(i<k && (lee[i][0]!=fl || lee[i][1]!=fc)){
        for(j=0;j<4;j++)
        {
            if(v[lee[i][0]+dirl[j]][lee[i][1]+dirc[j]]>acc && marc[lee[i][0]+dirl[j]][lee[i][1]+dirc[j]]==0){
                lee[k][0]=lee[i][0]+dirl[j];
                lee[k][1]=lee[i][1]+dirc[j];
                marc[lee[i][0]+dirl[j]][lee[i][1]+dirc[j]]=1;
                k++;
            }
        }
        i++;
    }
    if(lee[i][0]==fl && lee[i][1]==fc)
        return 1;
    return 0;
}

int main()
{
    int i,j,k=0,l,c,r,p;
    char ch;
    FILE*fi,*fo;
    fi=fopen("barbar.in","r");
    fo=fopen("barbar.out","w");
    fscanf(fi,"%d%d",&l,&c);
    fgetc(fi);
    for(i=1; i<=l; i++)
    {
        for(j=1; j<=c; j++)
        {
            ch=fgetc(fi);
            if(ch=='I')
            {
                sl=i;
                sc=j;
            }
            else if(ch=='O')
            {
                fl=i;
                fc=j;
            }
            else if(ch=='D')
            {
                dragoni[k][0]=i;
                dragoni[k][1]=j;
                v[i][j]=1;
                k++;
            }
            else if(ch=='*')
                v[i][j]=-1;
        }
        fgetc(fi);
    }
    for(i=0; i<=l+1 || i<=c+1; i++)
    {
        v[i][0]=-1;
        v[i][c+1]=-1;
        v[0][i]=-1;
        v[l+1][i]=-1;
    }
    i=0;
    while(i<k){
        for(j=0;j<4;j++)
        {
            if(v[dragoni[i][0]+dirl[j]][dragoni[i][1]+dirc[j]]==0){
                dragoni[k][0]=dragoni[i][0]+dirl[j];
                dragoni[k][1]=dragoni[i][1]+dirc[j];
                k++;
                v[dragoni[i][0]+dirl[j]][dragoni[i][1]+dirc[j]]=v[dragoni[i][0]][dragoni[i][1]]+1;
            }
        }
        i++;
    }
    r=0;
    p=1<<12;
    while(p>0)
    {

        if(check(r+p)==1)
            r+=p;
        reset();
        p/=2;
    }
    if(v[sl][sc]-1<r)
        r=v[sl][sc]-1;
    fprintf(fo,"%d",r);
    fclose(fi);
    fclose(fo);
    return 0;
}