Cod sursa(job #2033253)

Utilizator leraValeria lera Data 6 octombrie 2017 15:09:49
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#define Nmax 1005
#define INF (1<<30)
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int d[Nmax][Nmax],inq[Nmax][Nmax],ans,n,m,iin,jin,ifin,jfin,ls,ld,dd[Nmax][Nmax];
pair<int,int>p;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
char a[Nmax][Nmax];
queue<pair<int,int> >q;
int ins(int i, int j)
{
    if(i >= 1 && i <= n && j >= 1 && j <= m)return 1;
    return 0;
}
void parc(int i, int j)
{
    for(int r = 0 ; r <= 3; r++)
    {
        int ii = i + dx[r];
        int jj = j + dy[r];
        if(ins(ii, jj) && a[ii][jj] != '*')
        {
            if(d[ii][jj] > d[i][j] + 1)
            {
                d[ii][jj] = d[i][j] + 1;
                ans = max(ans, d[ii][jj]);
                q.push(make_pair(ii,jj));
            }
        }
    }
}
void parcurgere(int i, int j,int x)
{
    for(int r = 0 ; r <= 3; r++)
    {
        int ii = i + dx[r];
        int jj = j + dy[r];
        if(ins(ii, jj) && a[ii][jj] != '*')
        {
            if(dd[ii][jj] > dd[i][j] + 1 && d[ii][jj] >= x)//distanta din ii jj pana la cel mai apropiat dragon sa nu fie mai mica decat x
            {
                dd[ii][jj] = dd[i][j] + 1;
                q.push(make_pair(ii,jj));
            }
        }
    }
}
int verif(int x)
{
    for(int i =1; i<= n; i++)for(int j = 1; j<= n; j++)dd[i][j] =INF;
    dd[iin][jin] = 0;
    if(d[iin][jin] < x)return 0;
    q.push(make_pair(iin, jin));
    while(!q.empty())
    {
        p = q.front();
        parcurgere(p.first,p.second,x);
        q.pop();
    }
    if(dd[ifin][jfin]!=INF)return 1;
    return 0;
}
int main()
{
    fin >> n >> m;
    for(int i =1; i<= n; i++)for(int j = 1; j<= n; j++)d[i][j] =INF;//distantele pana la dragoni
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            fin >> a[i][j];
            if(a[i][j] == 'D')
            {
                q.push(make_pair(i,j));
                d[i][j] = 0;
            }
            if(a[i][j] == 'I')iin = i, jin = j;
            if(a[i][j] == 'O')ifin = i, jfin = j;
        }
    while(!q.empty())
    {
        p = q.front();
        q.pop();
        parc(p.first,p.second);
    }
    ls = 0;
    ld = ans + 1;
    while(ls < ld)
    {
        int mij = (ls + ld)/2 + 1;
        if(verif(mij))ls = mij;//fixez distanta minima pana la un dragon
        else ld = mij - 1;
    }
    if(verif(ls))
    fout << ls;
    else fout << -1;
    return 0;
}