Cod sursa(job #2712766)

Utilizator cezar.balutaCezar Baluta cezar.baluta Data 26 februarie 2021 15:00:13
Problema Barbar Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.3 kb
#include <iostream>
#include <fstream>
#include<queue>
using namespace std;

int dragoni[100][100],mat[100][100];
int n,m,x_final,y_final;
struct Nod
{
    int x;
    int y;
};
void bordare()
{
    for(int i=0;i<=n+1;i++)
    {
        mat[i][0]=-1;
        mat[i][m+1]=-1;
        dragoni[i][0]=-1;
        dragoni[i][m+1]=-1;
    }
    for(int j=0;j<=m+1;j++)
    {
        mat[0][j]=-1;
        mat[n+1][j]=-1;
        dragoni[0][j]=-1;
        dragoni[n+1][j]=-1;
    }
}
bool verif(int dist)
{
    int matrice[100][100];
    queue<Nod>q;
    for(int i=0; i<=n+1; i++)
    {
        for(int j=0; j<=m+1; j++)
        {
            if(mat[i][j]==1)
            {
                Nod nn;
                nn.x=i;
                nn.y=j;
                q.push(nn);
            }
            matrice[i][j]=mat[i][j];
        }
    }
    while(!q.empty())
    {
        Nod nod=q.front();
        Nod adaugare;
        q.pop();
        if(nod.x==x_final && nod.y == y_final)
        {
            return 1;
        }
        if(matrice[nod.x+1][nod.y]==0 && dragoni[nod.x+1][nod.y]>=dist)
        {
            matrice[nod.x+1][nod.y]=matrice[nod.x][nod.y]+1;
            adaugare.x=nod.x+1;
            adaugare.y=nod.y;
            q.push(adaugare);
        }
        if(matrice[nod.x-1][nod.y]==0 && dragoni[nod.x-1][nod.y]>=dist)
        {
            matrice[nod.x-1][nod.y]=matrice[nod.x][nod.y]+1;
            adaugare.x=nod.x-1;
            adaugare.y=nod.y;
            q.push(adaugare);
        }
        if(matrice[nod.x][nod.y+1]==0 && dragoni[nod.x][nod.y+1]>=dist)
        {
            matrice[nod.x][nod.y+1]=matrice[nod.x][nod.y]+1;
            adaugare.x=nod.x;
            adaugare.y=nod.y+1;
            q.push(adaugare);
        }
        if(matrice[nod.x][nod.y-1]==0 && dragoni[nod.x][nod.y-1]>=dist)
        {
            matrice[nod.x][nod.y-1]=matrice[nod.x][nod.y]+1;
            adaugare.x=nod.x;
            adaugare.y=nod.y-1;
            q.push(adaugare);
        }
    }
    return 0;
}

int cb()
{
    int st=0;
    int dr=min(n,m);
    int mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(verif(mij+1))
        {
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
    }
    return dr;
}



int lee()
{
    queue<Nod>q;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            if(dragoni[i][j]==1)
            {
                Nod nn;
                nn.x=i;
                nn.y=j;
                q.push(nn);
            }
        }
    }
    while(!q.empty())
    {
        Nod nod=q.front();
        Nod adaugare;
        q.pop();
        if(dragoni[nod.x+1][nod.y]==0)
        {
            dragoni[nod.x+1][nod.y]=dragoni[nod.x][nod.y]+1;
            adaugare.x=nod.x+1;
            adaugare.y=nod.y;
            q.push(adaugare);
        }
        if(dragoni[nod.x-1][nod.y]==0)
        {
            dragoni[nod.x-1][nod.y]=dragoni[nod.x][nod.y]+1;
            adaugare.x=nod.x-1;
            adaugare.y=nod.y;
            q.push(adaugare);
        }
        if(dragoni[nod.x][nod.y+1]==0)
        {
            dragoni[nod.x][nod.y+1]=dragoni[nod.x][nod.y]+1;
            adaugare.x=nod.x;
            adaugare.y=nod.y+1;
            q.push(adaugare);
        }
        if(dragoni[nod.x][nod.y-1]==0)
        {
            dragoni[nod.x][nod.y-1]=dragoni[nod.x][nod.y]+1;
            adaugare.x=nod.x;
            adaugare.y=nod.y-1;
            q.push(adaugare);
        }
    }

}

int main()
{
    ifstream in("barbar.in");
    ofstream out("barbar.out");
    char c;
    in>>n>>m;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<m; j++)
        {
            in>>c;
            if(c=='D')
            {
                dragoni[i][j]=1;
                mat[i][j]=-1;
            }
            else if(c=='*')
            {
                dragoni[i][j]=-1;
                mat[i][j]=-1;
            }
            else if(c=='O')
            {
                x_final=i;
                y_final=j;
            }
            else if(c=='I')
            {
                mat[i][j]=1;
            }
        }
    }
    bordare();
    lee();
    out<<cb();


    return 0;
}