Cod sursa(job #2240491)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 13 septembrie 2018 16:38:21
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.9 kb
#include<cstdio>
#include<fstream>
#include<queue>
using namespace std;
FILE *f=fopen("barbar.in","r");
ofstream g("barbar.out");
char s[1002][1002];
int a[1002][1002],coada[1000002][2],n,m,x1,y1,x2,y2;
int dx[]={1,-1,0, 0};
int dy[]={0, 0,1,-1};
bool visited[1002][1002];
struct elem
{
    int x,y;
};
queue <elem> q;

int valid(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m&&visited[x][y]==0&&s[x][y]!='*';
}

int lee(int q)
{
    int l=1,r=0,i=x1,j=y1;
    visited[i][j]=1;
    coada[++r][0]=i;
    coada[r][1]=j;
    if(a[i][j]>=q)
    {
    while(l<=r)
    {
        i=coada[l][0];
        j=coada[l][1];
        if(i+1<=n&&a[i+1][j]>=q&&visited[i+1][j]==0&&s[i+1][j]!='*')
        {
            coada[++r][0]=i+1;
            coada[r][1]=j;
            if(coada[r][0]==x2&&coada[r][1]==y2)
                return 1;
            visited[i+1][j]=1;
        }
        if(i-1>=1&&a[i-1][j]>=q&&visited[i-1][j]==0&&s[i-1][j]!='*')
        {
            coada[++r][0]=i-1;
            coada[r][1]=j;
            if(coada[r][0]==x2&&coada[r][1]==y2)
                return 1;
            visited[i-1][j]=1;
        }
        if(j+1<=m&&a[i][j+1]>=q&&visited[i][j+1]==0&&s[i][j+1]!='*')
        {
            coada[++r][0]=i;
            coada[r][1]=j+1;
            if(coada[r][0]==x2&&coada[r][1]==y2)
                return 1;
            visited[i][j+1]=1;
        }
        if(j-1>=1&&a[i][j-1]>=q&&visited[i][j-1]==0&&s[i][j-1]!='*')
        {
            coada[++r][0]=i;
            coada[r][1]=j-1;
            if(coada[r][0]==x2&&coada[r][1]==y2)
                return 1;
            visited[i][j-1]=1;
        }
        l++;
    }
    }
    return 0;
}

int main()
{
    int i,j,maxim=0,st,dr,mij;
    char c;
    fscanf(f,"%d%d",&n,&m);
    fscanf(f,"%c",&c);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            fscanf(f,"%c",&s[i][j]);
            if(s[i][j]=='I')
                x1=i,y1=j;
            if(s[i][j]=='O')
                x2=i,y2=j;
            if(s[i][j]=='D')
                q.push({i,j}),visited[i][j]=1;
        }
        fscanf(f,"%c",&c);
    }
    while(!q.empty())
    {
        for(i=0;i<=3;i++)
            if(valid(q.front().x+dx[i],q.front().y+dy[i]))
            {
                q.push({q.front().x+dx[i],q.front().y+dy[i]});
                visited[q.front().x+dx[i]][q.front().y+dy[i]]=1;
                a[q.front().x+dx[i]][q.front().y+dy[i]]=a[q.front().x][q.front().y]+1;
            }
        q.pop();
    }
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    if(a[i][j]>=maxim)
        maxim=a[i][j];
    st=0;
    dr=maxim;
    while(st<=dr)
    {
        for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            visited[i][j]=0;
        mij=(st+dr)/2;
        if(lee(mij)==1)
            st=mij+1;
        else
            dr=mij-1;
    }
    g<<st-1;
    return 0;
}