Cod sursa(job #2051595)

Utilizator AndaionicaIonica Anda Maria Andaionica Data 29 octombrie 2017 12:06:42
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int p,u,q[2][1000001],v[1002][1002],a[1002][1002],i,j,l1,c1,l2,c2,n,m,x,sol,st,dr,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
char t;
bool viz[1001][1001];
void dragon()
{
    while(p<=u)
    {
        int i;
        int l=q[0][p];
        int c=q[1][p];
        for(i=0;i<=3;i++)
        {
            int lx=l+dx[i];
            int cy=c+dy[i];
            if(v[lx][cy]==0&&a[lx][cy]==1)
            {
                u++;
                q[0][u]=lx;
                q[1][u]=cy;
                v[lx][cy]=v[l][c]+1;
            }
        }
        p++;
    }
}
int coada(int x)
{
    int p=1;
    int u=1;
    int i;
    if(v[l1][c1]<x)
        return 0;
    q[0][1]=l1;
    q[1][1]=c1;
    memset(viz,0,sizeof(viz));
    viz[l1][c1]=1;
    while(p<=u&&viz[l2][c2]==0)
    {
        int l=q[0][p];
        int c=q[1][p];
        for(i=0;i<=3;i++)
        {
            int lx=l+dx[i];
            int cy=c+dy[i];
            if(v[lx][cy]>=x&&viz[lx][cy]==0&&a[lx][cy]==1)
            {
                u++;
                q[0][u]=lx;
                q[1][u]=cy;
                viz[lx][cy]=1;
            }
        }
        p++;
    }
    if(viz[l2][c2]==1)
        return 1;
    return 0;
}
int main()
{
    f>>n>>m;
    for(i=0;i<=n+1;i++)
    {
        v[i][0]=-1;
        v[i][m+1]=-1;
    }
    for(j=0;j<=m+1;j++)
    {
        v[0][j]=-1;
        v[n+1][j]=-1;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            f>>t;
            if(t=='D')
            {
                u++;
                q[0][u]=1;
                q[1][u]=1;
            }
           else
            if(t=='I')
            {
                l1=i;
                c1=j;
                a[i][j]=1;
            }
            else
            if(t=='*')
                v[i][j]=-1;
           else
            if(t=='O')
            {
                l2=i;
                c2=j;
                a[i][j]=1;
            }
            else
                a[i][j]=1;
        }
    p=1;
    dragon();
    st=0;
    dr=max(n,m);
    sol=-1;
    while(st<=dr)
    {
        x=(st+dr)/2;
        if(coada(x)==1)
        {
            sol=x;
            st=x+1;
        }
            else
            {
              dr=x-1;
            }
    }
    g<<sol;
    return 0;
}