Cod sursa(job #1884472)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 18 februarie 2017 20:01:48
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <iostream>
#include <cstdio>
#include <cmath>
#define MAXN 1000
using namespace std;
int n,m,dist[MAXN][MAXN],maxim,inc,sf,startx,starty,stopx,stopy;
bool ap[MAXN][MAXN];
char a[MAXN][MAXN],dlin[]={-1,0,1,0},dcol[]={0,1,0,-1};
struct coada
{
    int lin,col;
}c[MAXN*MAXN];
inline bool OK(int i,int j)
{
    return (i>=0 && j>=0 && i<n && j<m);
}
void Lee()
{
    int i,j,i2,j2;
    while(inc<sf)
    {
        i=c[inc].lin;j=c[inc++].col;
        for(int d=0;d<4;d++)
        {
            i2=i+dlin[d];j2=j+dcol[d];
            if(OK(i2,j2) && a[i2][j2]!='*' && (!ap[i2][j2] || dist[i2][j2]>dist[i][j]+1))
            {
                dist[i2][j2]=dist[i][j]+1;
                maxim=max(maxim,dist[i2][j2]);
                c[sf].lin=i2;c[sf++].col=j2;
                ap[i2][j2]=true;
            }
        }
    }
}
inline bool parcurgere(int di)
{
    int i,j,i2,j2;
    bool viz[MAXN][MAXN];
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            viz[i][j]=false;
    while(inc<sf && !viz[stopx][stopy])
    {
        i=c[inc].lin;j=c[inc++].col;
        viz[i][j]=true;
        for(int d=0;d<4;d++)
        {
            i2=i+dlin[d];j2=j+dcol[d];
            if(OK(i2,j2) && !viz[i2][j2] && dist[i2][j2]>=di)
            {
                c[sf].lin=i2;c[sf++].col=j2;
                viz[i2][j2]=true;
            }
        }
    }
    return viz[stopx][stopy];
}
int cbin()
{
    int i=0,pas=log2(maxim);
    for(pas=1<<pas;pas;pas>>=1)
    {
        inc=sf=0;
        c[sf].lin=startx,c[sf++].col=starty;
        if(parcurgere(i+pas))
            i+=pas;
    }
    return i;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("barbar.in","r");
    fout=fopen("barbar.out","w");
    fscanf(fin,"%d%d\n",&n,&m);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            a[i][j]=fgetc(fin);
            if(a[i][j]=='D')
            {
                c[sf].lin=i;c[sf++].col=j;
                ap[i][j]=true;
            }
            else
                if(a[i][j]=='I')
                    startx=i,starty=j;
            else
                if(a[i][j]=='O')
                    stopx=i,stopy=j;
        }
        fgetc(fin);
    }
    Lee();
    fprintf(fout,"%d",cbin());
    fclose(fin);
    fclose(fout);
    return 0;
}