Cod sursa(job #2869100)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 11 martie 2022 12:33:06
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

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

const int INF=1e9;
const int NMAX=1005;
char s[NMAX][NMAX];
int b[NMAX][NMAX];
int n,m,ok;
int istart,jstart,ifinal,jfinal;

int viz[NMAX][NMAX];
queue<pair<int,int >>q;

const int di[]={-1,1,0,0};
const int dj[]={0,0,1,-1};

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

void fill(int i,int j,int x)
{
    if(inmat(i,j) && ok==1 && s[i][j]!='*' && b[i][j]>=x && viz[i][j]==0)
    {
        viz[i][j]=1;
        if(i==ifinal && j==jfinal)
            ok=0;
        fill(i+1,j,x);
        fill(i-1,j,x);
        fill(i,j+1,x);
        fill(i,j-1,x);
    }
}

bool verif(int x)
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            viz[i][j]=0;
    ok=1;
    fill(istart,jstart,x);
    return viz[ifinal][jfinal];
}

int main()
{
    int i,j,x,y,ii,jj;
    int kon=-1;
    fin>>n>>m;
    for(i=1;i<=n;i++)  ///citire
        for(j=1;j<=m;j++)
        {
            fin>>s[i][j];
            b[i][j]=INF;
            if(s[i][j]=='I')
            {
                istart=i;
                jstart=j;
            }
            else if (s[i][j] == 'O')
            {
                ifinal=i;
                jfinal=j;
            }
            else if(s[i][j]=='D')
            {
                b[i][j]=0;
                q.push(make_pair(i,j));
            }
        }
    while(!q.empty())   ///bfs
    {
        pair<int,int>p=q.front();
        x=p.first;
        y=p.second;
        q.pop();
        for(i=0;i<=3;i++)
        {
            ii=x+di[i];
            jj=y+dj[i];
            if(inmat(ii,jj) && b[ii][jj]>1+b[x][y] && s[ii][jj]!='*')
            {
                b[ii][jj]=b[x][y]+1;
                q.push(make_pair(ii,jj));
            }
        }
    }
    int st=1;
    int dr=b[ifinal][jfinal];
    int mij;
    while(st<=dr)     ///cautare binara
    {
        mij=(st+dr)/2;
        if(verif(mij))
        {
            kon=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    fout <<kon<<"\n";
    return 0;
}