Cod sursa(job #2952020)

Utilizator PieleVoinescu David Piele Data 8 decembrie 2022 00:21:29
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define nmax 1005
#define abs(a,b) ((a>b)?(a-b):(b-a))

using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

int n,m;
int mat[nmax][nmax];
int ras[nmax][nmax];
int om[nmax][nmax];
int istop,jstop,istart,jstart;
queue<pair<int,int>>Q;
vector<pair<int,int>>Vec;
const int di[4]={1,0,-1,0};
const int dj[4]={0,1,0,-1};

bool ebun(int i,int j)
{
    return i>=1 && i<=n && j>=1 && j<=m;
}


void citire()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
    {
        char lit;
        fin>>lit;
        if(lit=='I')
        {
            istart=i;
            jstart=j;
        }

        else if(lit=='O')
        {
            istop=i;
            jstop=j;
        }
        else if(lit=='*')
        mat[i][j]=1;
        else if(lit=='D')
        {
            mat[i][j]=1;
            ras[i][j]=1;
            Q.push({i,j});
        }
    }
}


void LeeDragoni()
{

    while(!Q.empty())
    {
        int i=Q.front().first;
        int j=Q.front().second;
        Q.pop();
        for (int dir=0;dir<4;++dir)
        {
            int i_nou=i+di[dir];
            int j_nou=j+dj[dir];
            if(ebun(i_nou,j_nou) && ras[i_nou][j_nou]==0)
            {
                ras[i_nou][j_nou]=ras[i][j]+1;
                Q.push({i_nou,j_nou});
            }
        }
    }
   while(!Q.empty())
    Q.pop();
}

bool LeeOm(int pas)
{
    Q.push({istart,jstart});
    om[istart][jstart]=pas;
    while(!Q.empty())
    {
        int i=Q.front().first;
        int j=Q.front().second;
        Q.pop();
        for (int dir=0;dir<4;++dir)
        {
            int i_nou=i+di[dir];
            int j_nou=j+dj[dir];
            if(ebun(i_nou,j_nou) && mat[i_nou][j_nou]==0 && ras[i_nou][j_nou]>=pas && om[i_nou][j_nou]!=pas)
            {
                om[i_nou][j_nou]=pas;
                Q.push({i_nou,j_nou});

            }
        }
    }
    if(om[istop][jstop]==pas)
        return true;
     return false;

}

int main()
{citire();
    LeeDragoni();
    int st=2,dr=ras[istart][jstart];
    int rez=0;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        if(LeeOm(mid))
        {
            rez=mid;
            st=mid+1;
        }
        else dr=mid-1;
    }
    fout<<rez-1;

    return 0;
}