Cod sursa(job #2444951)

Utilizator BaraianTudorBaraian Tudor Stefan BaraianTudor Data 1 august 2019 20:57:32
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define f first
#define s second
#define pb push_back
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int n,m,dist[1005][1005];
bool b[1005][1005],b1[1005][1005];
char a[1005][1005];
pair <int,int> inc,fin;
vector <pair<int,int> > dragon;
queue <pair<int,int> > q;
bool verif(int x,int y)
{
    if(x>0 && y>0 && x<=n && y<=m)return 1;
    return 0;
}
bool parc(int dis)
{
    int x,y,ok=0;
    q.push(make_pair(inc.f,inc.s));
    b1[inc.f][inc.s]=1;
    while(!q.empty())
    {
        x=q.front().f;
        y=q.front().s;
        q.pop();
        for(int i=0;i<4;i++)
        {
            int x1=x+dx[i];
            int y1=y+dy[i];
            if(verif(x1,y1) && !b1[x1][y1] && a[x1][y1]!='D' && dist[x1][y1]>=dis)
            {
                b1[x1][y1]=1;
                if(a[x1][y1]=='O')ok=1;
                q.push(make_pair(x1,y1));
            }
        }
    }
    if(ok)return 1;
    return 0;
}
int cb()
{
    int poz=0;
    for(int i=1<<30;i>0;i=i/2)
    {
        if(poz+i<=dist[fin.f][fin.s])
        {
            if(parc(poz+i))
            {
                poz+=i;
            }
        }
    }
    if(poz==0)return -1;
    return poz;
}
void distanta()
{
    int x,y;
    int sz=dragon.size();
    for(int i=0;i<=sz;i++)
    {
        q.push(make_pair(dragon[i].f,dragon[i].s));
    }
    while(!q.empty())
    {
        x=q.front().f;
        y=q.front().s;
        q.pop();
        for(int i=0;i<4;i++)
        {
            int x1=x+dx[i];
            int y1=y+dy[i];
            if(verif(x1,y1) && !b[x1][y1] && a[x1][y1]!='D')
            {
                b[x1][y1]=1;
                dist[x1][y1]=dist[x][y]+1;
                q.push(make_pair(x1,y1));
            }
        }
    }
}
int main()
{
    in>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            in>>a[i][j];
            if(a[i][j]=='I')inc.f=i,inc.s=j;
            if(a[i][j]=='O')fin.f=i,fin.s=j;
            if(a[i][j]=='D')dragon.pb(make_pair(i,j));
            if(a[i][j]=='*')b[i][j]=1,b1[i][j]=1;
        }
    }
    distanta();
    out<<cb();
    return 0;
}