Cod sursa(job #1327315)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 26 ianuarie 2015 16:40:56
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <fstream>
#include <string.h>

using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int OK,n,m,l1,l2,c1,c2,a[1001][1001],dx[]={1,0,-1,0},dy[]={0,1,0,-1},q[2][1000002],sol=-1;
bool d[1001][1001];
char ch;
void coada1(int nr)
{
    int x,y,l,c,p=1,u=1;
    OK=0;
    memset(d,0,sizeof(d));
    while(p<=u&&OK==0)
    {
        x=q[0][p];
        y=q[1][p];
        for(int i=0;i<4;i++)
        {
            l=x+dx[i];
            c=y+dy[i];
            if(a[l][c]>=nr&&d[l][c]==0&&l>0&&c>0&&l<=n&&c<=m)
            {
                d[l][c]=1;
                q[0][++u]=l;
                q[1][u]=c;
                if(l==l2&&c==c2)
                    OK=1;
            }
        }
        p++;
    }
}
void coada(int p, int u)
{
    int x,y,l,c;
    while(p<=u)
    {
        x=q[0][p];
        y=q[1][p];
        for(int i=0;i<4;i++)
        {
            l=x+dx[i];
            c=y+dy[i];
            if(a[l][c]==0&&d[l][c]==0&&l>0&&c>0&&l<=n&&c<=m)
            {
                a[l][c]=a[x][y]+1;
                q[0][++u]=l;
                q[1][u]=c;
            }
        }
        p++;
    }
}
int bin(int st, int dr)
{
    int mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        coada1(mij);
        if(OK==1)
        {
            st=mij+1;
            sol=max(sol,mij);
        }
        else
            dr=mij-1;
    }
    return sol;
}
int main()
{
int p=1,u=1;
fin>>n>>m;
for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
        fin>>ch;
        if(ch=='.')
            a[i][j]=0;
            else
                if(ch=='*')
                    a[i][j]=-1;
                    else
                        if(ch=='D')
                        {
                            d[i][j]=1;
                            q[0][++u]=i;
                            q[1][u]=j;
                        }
                            else
                                if(ch=='I')
                                {
                                    l1=i;
                                    c1=j;
                                }
                                else
                                {
                                    l2=i;
                                    c2=j;
                                }
    }

coada(p,u);
q[0][1]=l1;
q[1][1]=c1;
memset(d,0,sizeof(d));
fout<<bin(1,min(n,m));


    return 0;
}