Cod sursa(job #838445)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 19 decembrie 2012 18:21:41
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#define MAX 2147483647
using namespace std;
int r,c,px,py,fx,fy,a[1010][1010],aux[1010][1010];
queue <pair <short,short> > c2;

const int dx[4]= {0,0,-1,1};
const int dy[4]= {-1,1,0,0};

inline bool ok(int x,int y) {
    return x>0 && x<=r && y>0 && y<=c;
}

int bun(int t)
{
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            aux[i][j]=0;

    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            if(a[i][j]<t) aux[i][j]=-1;

    c2.push(make_pair(px,py));
    aux[px][py]=1;

    while(!c2.empty())
    {
        int x=c2.front().first, y=c2.front().second;
        c2.pop();
        for(int i=0;i<4;i++)
        {
            int xv=x+dx[i], yv=y+dy[i];
            if( ok(xv,yv) && aux[xv][yv]==0)
            {
                if(xv == fx && yv==fy)
                {
                    while(!c2.empty())
                    {
                        c2.pop();
                    }
                    return 1;
                }
                aux[xv][yv]=1;
                c2.push(make_pair(xv,yv));
            }
        }
    }
    return 0;
}
int caut(int st,int dr)
{
    int r2=-1;
    while(st<=dr)
    {
        int m=(st+dr)/2;
        if(bun(m))
        {
            if(r2==-1) r2=m;
            else if(m>r2) r2=m;
            st=m+1;
        }
        else
        dr=m-1;
    }
    return r2;
}
int main()
{
    //citire
    ifstream fin("barbar.in");
    ofstream fout("barbar.out");
    fin>>r>>c;
    fin.get();
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
        {
            char x;
            fin.get(x);
            if(x=='.') a[i][j]=MAX;
            else if(x=='*') a[i][j]=-2;
            else if(x=='D')
            {
                a[i][j] = 0;
                c2.push(make_pair(i,j));
            }
            else if(x=='I') {px=i;py=j;a[i][j]=MAX;}
            else {fx=i;fy=j;a[i][j]=MAX;}
        }
        fin.get();
    }

    while(!c2.empty())
    {
        int x=c2.front().first, y=c2.front().second;
        c2.pop();
        for(int i=0;i<4;i++)
        {
            int xv=x+dx[i], yv=y+dy[i];
            if(ok(xv,yv) && a[xv][yv]!=-2 && a[xv][yv]!=0 && a[xv][yv] > a[x][y]+1)
            {
                a[xv][yv]=a[x][y]+1;
                c2.push(make_pair(xv,yv));
            }
        }
    }

    int maxim = -1;
    for(int i = 1; i <= r; ++i)
        for(int j = 1; j <=c; ++j) {
            if(maxim < a[i][j] && a[i][j] != MAX)
                maxim = a[i][j];
        }

    maxim = min(min(maxim, a[px][py]), a[fx][fy]);
    fout<<caut(1,maxim);
    return 0;
}