Cod sursa(job #2083033)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 6 decembrie 2017 23:33:38
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct punct
{
    int Linie,Coloana,Distanta;
} PunctStart,PunctSfarsit;
char c;
int mat[1005][1005],dx[]= {-1,0,1,0},dy[]= {0,1,0,-1},m,n;
queue<punct> Coada;
ifstream f("barbar.in");
ofstream g("barbar.out");
void CompleteazaMatrice(int L,int C,int Val)
{
    if(c=='D')
    {
        mat[L][C]=0;
        punct aux;
        aux.Linie=L;
        aux.Coloana=C;
        aux.Distanta=0;
        Coada.push(aux);
        return ;
    }
    if(c=='*')
    {
        mat[L][C]=-1;
        return ;
    }
    mat[L][C]=-2;
    if(c=='.') return ;
    if(c=='I')
    {
        PunctStart.Linie=L;
        PunctStart.Coloana=C;
        return ;
    }
    PunctSfarsit.Linie=L;
    PunctSfarsit.Coloana=C;
}
int Drum(int valoare)
{
    while(!Coada.empty()) Coada.pop();
    bool viz[1005][1005];
    for(int i=1;i<=m;++i)
        for(int j=1;j<=m;++j)
            viz[i][j]=0;
    punct aux=PunctStart;
    aux.Distanta=0;
    Coada.push(aux);
    viz[aux.Linie][aux.Coloana]=1;
    while(!Coada.empty())
    {
        int linie=Coada.front().Linie;
        int coloana=Coada.front().Coloana;
        int distanta=Coada.front().Distanta;
        int i;
        for(i=0; i<4; ++i)
        {
            punct aux;
            aux.Linie=linie+dx[i];
            aux.Coloana=coloana+dy[i];
            if(!viz[aux.Linie][aux.Coloana] && mat[aux.Linie][aux.Coloana]>=valoare)
            {
                viz[aux.Linie][aux.Coloana]=1;
                if(PunctSfarsit.Linie==aux.Linie && PunctSfarsit.Coloana==aux.Coloana) goto endwhile;
                aux.Distanta=distanta+1;
                Coada.push(aux);
            }
        }
        Coada.pop();
    }
endwhile:
    if(Coada.empty()) return 0;
    return 1;
}
int CautareBinara(int st,int dr)
{
    int LastApp=-1;
    while(st<=dr)
    {
        int mij=(dr-st)/2+st;
        if(Drum(mij)==1)
        {
            LastApp=mij;
            st=mij+1;
            continue;
        }
        dr=mij-1;
    }
    return LastApp;
}
int main()
{
    f>>m>>n;
    for(int i=1; i<=m; ++i)
        for(int j=1; j<=n; ++j)
        {
            f>>c;
            CompleteazaMatrice(i,j,c);
        }
    while(!Coada.empty())
    {
        int linie=Coada.front().Linie;
        int coloana=Coada.front().Coloana;
        int i;
        for(i=0; i<4; ++i)
            if(mat[linie+dx[i]][coloana+dy[i]]==-2)
            {
                punct aux;
                aux.Linie=linie+dx[i];
                aux.Coloana=coloana+dy[i];
                aux.Distanta=Coada.front().Distanta+1;
                Coada.push(aux);
                mat[aux.Linie][aux.Coloana]=aux.Distanta;
            }
        Coada.pop();
    }
    g<<CautareBinara(1,mat[PunctStart.Linie][PunctStart.Coloana])<<'\n';
    return 0;
}