Cod sursa(job #2082902)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 6 decembrie 2017 21:30:03
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.62 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())
    {
        
        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;
  
     
    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();
    int st,dr,mijl,raspuns=-1;
    st=0;
    dr=pericol[lin_plec][col_plec];
    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;
    }
     
    fout<<raspuns<<'\n';
    fin.close();
    fout.close();
    return 0;
}