Cod sursa(job #2480731)

Utilizator cristia_razvanCristia Razvan cristia_razvan Data 26 octombrie 2019 09:18:22
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.03 kb
#include <bits/stdc++.h>

using namespace std;

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

pair <int, int> v[1000005];
char a[1005][1005];
int b[1005][1005], n , m, k;
int xi,yi,xo,yo;
bitset <1003> c[1003];
///b[i][j] retine  distanta minima posibila de la poz i, j la un dragon
void bordare()
{
    int i, j;
    for(i = 0; i <= n + 1; i++)
        a[i][0] = a[i][m + 1] = '*';
    for(j = 0; j <= m + 1; j++)
        a[0][j] = a[n + 1][j] = '*';

}
void citire()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> (a[i] + 1);
}

void initial()
{
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            if(a[i][j] == 'I'){xi = i; yi = j;}
            if(a[i][j] == 'O'){xo = i; yo = j;}
            if(a[i][j] == 'D') {
                b[i][j] = 0;
                k++;
                v[k] = {i, j};///am retinut pozitiile lui D
            }
            else b[i][j] = 2000000;
        }
}
void distante()
{
    int i, j, x, y;
    while(k > 0)
    {
        i = v[k].first;
        j = v[k].second;
        k --;
        ///nord;
        x =i -1;
        y = j;
        if(a[x][y] != '*' && b[x][y] > 1 + b[i][j])
        {
            b[x][y] = 1 + b[i][j];
            k ++;
            v[k] = {x, y};
        }
        ///sud;
        x =i + 1;
        y = j;
        if(a[x][y] != '*' && b[x][y] > 1 + b[i][j])
        {
            b[x][y] = 1 + b[i][j];
            k ++;
            v[k] = {x, y};
        }
        ///est;
        x =i ;
        y = j + 1;
        if(a[x][y] != '*' && b[x][y] > 1 + b[i][j])
        {
            b[x][y] = 1 + b[i][j];
            k ++;
            v[k] = {x, y};
        }
        ///vest;
        x = i;
        y = j - 1;
        if(a[x][y] != '*' && b[x][y] > 1 + b[i][j])
        {
            b[x][y] = 1 + b[i][j];
            k ++;
            v[k] = {x, y};
        }


    }


}

void afisare()
{
    for(int i = 1; i <=n; i++)
    {for(int j = 1; j<=m; j++)
        if(b[i][j] != 2000000)
        fout<<b[i][j] <<" ";
        else fout<<"x ";
    fout<<"\n";
    }
}
///verific daca pot ajunge  de la I la O mergand doar pe valori mai mari sau egale decat val
inline void Fill(short i, short j, int val)
{
    if(a[i][j] != '*' && b[i][j] >= val && c[i][j] == 0)
    {
        c[i][j] = 1;
        Fill(i - 1, j, val);
        Fill(i + 1, j, val);
        Fill(i, j - 1, val);
        Fill(i, j + 1, val);
    }
}
inline void rezolva()
{
    int i;
    for(i = b[xi][yi]; i >= 1; i--)
    {
        ///incer sa vad daca pot ajunge din xy yi in xo yo mergand doar pe valori >= i
        for(int j = 1; j <= n; j++)
            c[j].reset();
        Fill(xi,yi, i);
        if(c[xo][yo] == 1)
        {
            fout << i <<"\n";
            fout.close();
            return;
        }
    }
    fout << "-1\n";
    fout.close();
}
int main()
{
    citire();
    bordare();
    initial();
    distante();
    rezolva();
    return 0;
}