Cod sursa(job #953524)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 26 mai 2013 14:16:55
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.09 kb
#include <fstream>
#include <deque>

using namespace std;

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

struct nod
{
    int lin,col;
    int pericol;
    nod()
    {
        lin=0;
        col=0;
        pericol=0;
    }
};

int r,c;
char m[1005][1005];
bool viz[1005][1005];
int pericol[1005][1005];
deque<nod> coada;
int lin_plec,col_plec;
int lin_ies,col_ies;

void bf()
{
    int i;
    nod aux;
    while(!coada.empty())
    {
       //cout<<"cu coada suntem in "<<coada.front().lin<<' '<<coada.front().col<<endl;
        for(i=0;i<4;i++)
        {
            if(((coada.front().lin+dy[i])<r) && ((coada.front().lin+dy[i])>=0) && ((coada.front().col+dx[i])<c) && ((coada.front().col+dx[i])>=0) && !viz[coada.front().lin+dy[i]][coada.front().col+dx[i]])
            {
                viz[coada.front().lin+dy[i]][coada.front().col+dx[i]]=1;
                pericol[coada.front().lin+dy[i]][coada.front().col+dx[i]]=coada.front().pericol+1;
                aux.lin=coada.front().lin+dy[i];
                aux.col=coada.front().col+dx[i];
                aux.pericol=coada.front().pericol+1;
                coada.push_back(aux);
            }
        }
        coada.pop_front();
    }
}

void init_viz()
{
    int i,j;

    for(i=0;i<r;i++)
        for(j=0;j<c;j++)
            if(m[i][j]=='*')
               viz[i][j]=1;
            else
               viz[i][j]=0;
}

void init_coada()
{
    while(!coada.empty())
        coada.pop_front();
}

bool posibil(int minim)
{
    int i;
    init_viz();
    init_coada();
    nod aux;
    aux.lin=lin_plec;
    aux.col=col_plec;
    coada.push_back(aux);
    bool reusit=false;

    while(!coada.empty())
    {
        for(i=0;i<4;i++)
        {
            if(((coada.front().lin+dy[i])<r) && ((coada.front().lin+dy[i])>=0) && ((coada.front().col+dx[i])<c) && ((coada.front().col+dx[i])>=0) && !viz[coada.front().lin+dy[i]][coada.front().col+dx[i]] && pericol[coada.front().lin+dy[i]][coada.front().col+dx[i]]>=minim)
            {
                if((coada.front().lin+dy[i])==lin_ies && (coada.front().col+dx[i])==col_ies)
                {
                    reusit=true;
                    break;
                }

                viz[coada.front().lin+dy[i]][coada.front().col+dx[i]]=1;
                aux.lin=coada.front().lin+dy[i];
                aux.col=coada.front().col+dx[i];
                coada.push_back(aux);
            }
        }
        coada.pop_front();
    }

    return reusit;
}

int main()
{
    ifstream fin("barbar.in");
    ofstream fout("barbar.out");
    fin>>r>>c;

    //Sa fiu sigur
    //if(r==c && r==1)
     //   fout<<"-1\n",fin.close(),fout.close();
    int i,j;
    for(i=0;i<r;i++)
        fin.get(),fin.get(m[i],1005);
    nod aux;

    for(i=0;i<r;i++)
        for(j=0;j<c;j++)
            if(m[i][j]=='D')
            {
               aux.lin=i;
               aux.col=j;
               aux.pericol=0;
               viz[i][j]=1;
               coada.push_back(aux);
            }
            else if(m[i][j]=='*')
                viz[i][j]=1;
            else if(m[i][j]=='I')
                lin_plec=i,col_plec=j;
            else if(m[i][j]=='O')
                lin_ies=i,col_ies=j;
    bf();
    /*
    cout<<'\n';
    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            cout<<pericol[i][j]<<' ';
        }
        cout<<'\n';
    }
    */
    int st,dr,mijl,raspuns=-1;
    st=0;
    dr=pericol[lin_plec][col_plec]; //ATENTIE!!! NU VERIFIC DACA PUNCTUL DE PLECARE SE INCADREAZA IN LIMITA (MIJL) -> ASA CA PLEC DE LA UN INTERVAL CE REPARA ACEASTA EROARE
    mijl=dr>>1;
    while(st<=dr)
    {
        if(posibil(mijl))
        {
            if(mijl>raspuns)
                raspuns=mijl;
            st=mijl+1;
        }
        else
            dr=mijl-1;
        mijl=(st+dr)>>1;
    }
    //cout<<posibil(0)<<posibil(1)<<posibil(2)<<posibil(3)<<posibil(4)<<posibil(5)<<posibil(6)<<posibil(7)<<posibil(8)<<endl;
    fout<<raspuns<<'\n';
    fin.close();
    fout.close();
    return 0;
}