Mai intai trebuie sa te autentifici.

Cod sursa(job #2390953)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 28 martie 2019 15:59:47
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda conccsd Marime 2.46 kb
#include <bits/stdc++.h>
#define Dim 1002
#define MAX 3000
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
bool OK();
int N,M,dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};
int D[Dim][Dim],mij,ans=-1;
int Muzeu[Dim][Dim],cnt;
char A[Dim][Dim];
bool viz[Dim][Dim],done=0;
typedef pair<int,int> pii;
pii start;

bool OK(int coordx,int coordy)
{
    return (coordx>=1&&coordy>=1&&coordx<=N&&coordy<=M);
}

queue < pii > qu;

void Lee()
{
    while(!qu.empty())
    {
        int l=qu.front().first;
        int c=qu.front().second;
        viz[l][c]=1;
        qu.pop();
        for(int i=1;i<=4;i++)
        {
            int l1=l+dx[i];
            int c1=c+dy[i];
            if(OK(l1,c1)&&A[l1][c1]!='D'&&A[l1][c1]!='*')
            {
                if(!viz[l1][c1])
                {
                    qu.push({l1,c1});
                    D[l1][c1]=D[l][c]+1;
                    viz[l1][c1]=1;
                }
                else
                if(D[l][c]+1<=D[l1][c1])
                {
                    D[l1][c1]=D[l][c]+1;
                    qu.push({l1,c1});
                }
            }
        }
    }
}

void Balanici()
{
    qu.push({start.first,start.second});
    cnt++;
    while(!qu.empty())
    {
        int l=qu.front().first;
        int c=qu.front().second;
        qu.pop();
        Muzeu[l][c]=cnt;
        if(A[l][c]=='O')
        {
            done=1;
            return;
        }
        for(int i=1;i<=4;i++)
        {
            int l1=l+dx[i];
            int c1=c+dy[i];
            if(OK(l1,c1)&&A[l1][c1]!='D'&&A[l1][c1]!='*')
            {
                if(Muzeu[l1][c1]!=cnt&&D[l1][c1]>=mij)
                {
                    Muzeu[l1][c1]=cnt;
                    qu.push({l1,c1});
                }
            }
        }
    }
}

int main()
{
    f>>N>>M; f.get();
    for(int i=1;i<=N;i++)
    for(int j=1;j<=M;j++)
    {
        f>>A[i][j];
        D[i][j]=MAX;
        if(A[i][j]=='D')
        {
            qu.push({i,j});
            viz[i][j]=1;
            D[i][j]=0;
        }
        else
        if(A[i][j]=='I') start={i,j};
        if(j==M) f.get();
    }
    Lee();
    int st=1,dr=D[start.first][start.second];
    for(int i=dr;i>=st&&done==0;i--)
    {
        mij=i;
        done=0;
        Balanici();
        if(done)
        ans=mij;
        while(!qu.empty()) qu.pop();
    }
    g<<ans;
    return 0;
}