Cod sursa(job #1891114)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 23 februarie 2017 19:03:49
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.43 kb
#include<stdio.h>
#define MAXN 1005
#define NRDIR 4
#define inf 1e6+1
struct coord
{
    int x,y;
};
void harsanDragonul();
bool harsanBarbarul(int dist);
void Bordaj();
void Reset();
FILE*fin,*fout;
int dx[NRDIR]={0,0,-1,1};
int dy[NRDIR]={1,-1,0,0};
int mat[MAXN][MAXN];
bool vizitat[MAXN][MAXN];
coord coada[10*MAXN*MAXN];
int pr=0,ult=-1;
int N,M;
coord start,finish;
int maxdist=-1;
int main()
{
    fin=fopen("barbar.in","r");
    fout=fopen("barbar.out","w");
    fscanf(fin,"%d%d",&N,&M);
    fgetc(fin);
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=M;j++)
        {
            char c;
            c=fgetc(fin);
            if(c=='I')
            {
                start.x=i;
                start.y=j;
            }
            else if(c=='O')
            {
                finish.x=i;
                finish.y=j;
            }
            else if(c=='*')
            {
                mat[i][j]=-1;
                vizitat[i][j]=1;
            }
            else if(c=='D')
            {
                coada[++ult].x=i;
                coada[ult].y=j;
                vizitat[i][j]=1;
            }
        }
        fgetc(fin);
    }
    Bordaj();
    harsanDragonul();
    if(!harsanBarbarul(1))
    {
        fprintf(fout,"-1");
    }
    else
    {
        int ans=1;
        int st=2,dr=maxdist;
        while(st<=dr)
        {
            int mij=(st+dr)/2;
            if(harsanBarbarul(mij))
            {
                ans=mij;
                st=mij+1;
            }
            else
            {
                dr=mij-1;
            }
        }
        fprintf(fout,"%d",ans);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}
void harsanDragonul()
{
    while(pr<=ult)
    {
        int ics=coada[pr].x;
        int igrec=coada[pr].y;
        if(maxdist<mat[ics][igrec])
        {
            maxdist=mat[ics][igrec];
        }
        for(int i=0;i<NRDIR;i++)
        {
            if(!vizitat[ics+dx[i]][igrec+dy[i]])
            {
                mat[ics+dx[i]][igrec+dy[i]]=mat[ics][igrec]+1;
                vizitat[ics+dx[i]][igrec+dy[i]]=1;
                coada[++ult].x=ics+dx[i];
                coada[ult].y=igrec+dy[i];
            }
        }
        pr++;
    }
}
void Bordaj()
{
    for(int i=0;i<=N+1;i++)
    {
        mat[i][0]=-1;
        mat[i][M+1]=-1;
        vizitat[i][0]=1;
        vizitat[i][M+1]=1;
    }
    for(int i=0;i<=M+1;i++)
    {
        mat[0][i]=-1;
        mat[N+1][0]=-1;
        vizitat[0][i]=1;
        vizitat[N+1][i]=1;
    }
}
bool harsanBarbarul(int dist)
{
    Reset();
    coada[++ult].x=start.x;
    coada[ult].y=start.y;
    vizitat[start.x][start.y]=1;
    if(mat[start.x][start.y]<dist)
    {
        return 0;
    }
    while(pr<=ult)
    {
        int ics=coada[pr].x,igrec=coada[pr].y;
        if(ics==finish.x && igrec==finish.y)
        {
            return 1;
        }
        for(int i=0;i<NRDIR;i++)
        {
            if((!vizitat[ics+dx[i]][igrec+dy[i]]) && (mat[ics+dx[i]][igrec+dy[i]]>=dist))
            {
                coada[++ult].x=ics+dx[i];
                coada[ult].y=igrec+dy[i];
                vizitat[ics+dx[i]][igrec+dy[i]]=1;
            }
        }
        pr++;
    }
    return 0;
}
void Reset()
{
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=M;j++)
        {
            vizitat[i][j]=0;
        }
    }
}