Cod sursa(job #1001694)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 25 septembrie 2013 20:11:46
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <queue>
#include <fstream>
#include <cstring>

using namespace std;

struct Coord {
    int x, y, cost;
    bool operator < (const Coord& e) const
	{
        return cost > e.cost;
    }
};

priority_queue <Coord> q;

int L,C,Lintrare,Cintrare,Liesire,Ciesire,b[1005][1005];
char a[1005][1005],v[1005][1005];

inline void Bordeaza()
{
    int i;
    for(i=0;i<=C+1;i++)
        a[0][i]=a[L+1][i]='*';
    for(i=0;i<=L+1;i++)
        a[i][0]=a[i][C+1]='*';
}

inline void Read()
{
    int i,j;
    Coord aux;
    ifstream fin("barbar.in");
    fin>>L>>C;
    for(i=1;i<=L;i++)
        fin>>(a[i]+1);
    Bordeaza();
    for(i=1;i<=L;i++)
        for(j=1;j<=C;j++)
            if(a[i][j]=='I')
            {
                Lintrare=i;Cintrare=j;
            }
            else
                if(a[i][j]=='O')
                {
                    Liesire=i;Ciesire=j;
                }
                else
                    if(a[i][j]=='D')
                    {
                        aux.x=i;
                        aux.y=j;
                        aux.cost=1;
                        q.push(aux);
                        b[i][j]=1;
                    }
    fin.close();
}

inline void Lee()
{
    Coord w,w2;
    int t;
    int dx[]={-1,0,1,0};
    int dy[]={0,1,0,-1};
    while(!q.empty())
    {
        w=q.top();
        q.pop();
        for(t=0;t<4;t++)
        {
            w2.x=w.x+dx[t];
            w2.y=w.y+dy[t];
            w2.cost=w.cost+1;
            if(a[w2.x][w2.y]!='*')
                if(b[w2.x][w2.y]==0)
                {
                    q.push(w2);
                    b[w2.x][w2.y]=w2.cost;
                }
        }
    }
}

inline void Fill(int i, int j, int d)
{

    if(a[i-1][j]!='*' && b[i-1][j]>d && v[i-1][j]!='1')
    {
        v[i-1][j]='1';
        Fill(i-1,j,d);
    }
    if(a[i+1][j]!='*' && b[i+1][j]>d && v[i+1][j]!='1')
    {
        v[i+1][j]='1';
        Fill(i+1,j,d);
    }
    if(a[i][j-1]!='*' && b[i][j-1]>d && v[i][j-1]!='1')
    {
        v[i][j-1]='1';
        Fill(i,j-1,d);
    }
    if(a[i][j+1]!='*' && b[i][j+1]>d && v[i][j+1]!='1')
    {
        v[i][j+1]='1';
        Fill(i,j+1,d);
    }
}

int main()
{
    int i,j,sol=-1,st,dr,d;
    Read();
    Lee();
    ofstream fout("barbar.out");
    /*for(i=1;i<=L;i++)
    {
        for(j=1;j<=C;j++)
            fout<<b[i][j]<<" ";
        fout<<"\n";
    }*/
    st=2;dr=2000;
    while(st<=dr)
    {
        d=(st+dr)/2;
        memset(v,'0',sizeof(v));
        v[Lintrare][Cintrare]='1';
        Fill(Lintrare,Cintrare,d);
        if(v[Liesire][Ciesire]=='1' && b[Lintrare][Cintrare]>=d)
        {
            sol=d;
            st=d+1;
        }
        else
            dr=d-1;
    }
    fout<<sol<<"\n";
    fout.close();
    return 0;
}