Cod sursa(job #1290880)

Utilizator tudormaximTudor Maxim tudormaxim Data 11 decembrie 2014 21:51:45
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <fstream>
using namespace std;
const int nmax =1005;
int dx[]={1, -1, 0, 0};
int dy[]={0, 0, 1, -1};

int mat[nmax][nmax], n, m, li, lf, ci, cf, i, j, u, p, ic, jc, iv, jv, d, dr, st, sol, mid;
int c[2][1000002];
char ch;
bool o[nmax][nmax], gasit;

int main()
{
    ifstream f("barbar.in");
    ofstream g("barbar.out");
    f>>m; f>>n;
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
        {
            f>>ch;
            if(ch=='*')
                mat[i][j]=-1;
            else if(ch=='D')
            {
                u++;
                c[0][u]=i;
                c[1][u]=j;
                mat[i][j]=1;
            }
            else if(ch=='I')
            {
                li=i;ci=j;
            }
            else if(ch=='O')
            {
                lf=i;cf=j;
            }
        }
    for(p=1; p<=u; p++)
    {
        ic=c[0][p];
        jc=c[1][p];
        for(d=0;d<=3;d++)
        {
            iv=ic+dx[d];
            jv=jc+dy[d];
            if(iv<=m && iv>0 && jv<=n && jv>0 && mat[iv][jv]==0)
            {
                u++;
                c[0][u]=iv;
                c[1][u]=jv;
                mat[iv][jv]=mat[ic][jc]+1;
            }
        }
    }
    st=1; dr=n*m; sol=0;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        p=1;u=1;
        c[0][u]=li;
        c[1][u]=ci;
        for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
        if(mat[i][j]!=-1)
            o[i][j]=0;
        else
            o[i][j]=1;
        o[li][ci]=1;
        gasit=0;
        while(p<=u && !gasit)
        {
            ic=c[0][p];
            jc=c[1][p];
            for(d=0;d<=3;d++)
            {
                iv=ic+dx[d];
                jv=jc+dy[d];
                if(iv<=m && iv>0 && jv<=n && jv>0 && mat[iv][jv]>=mid && o[iv][jv]==0)
                {
                    u++;
                    c[0][u]=iv;
                    c[1][u]=jv;
                    o[iv][jv]=1;
                    if(iv==lf && jv==cf)
                    {
                        gasit=1;
                        break;
                    }
                }
            }
            p++;
        }
        if(gasit && mat[li][ci]>=mid)
        {
            st=mid+1;
            sol=1;
        }
        else dr=mid-1;
    }
    if(sol) g<<dr-1<<"\n";
    else g<<"-1"<<"\n";

    f.close();
    g.close();
    return 0;
}