Cod sursa(job #2480730)

Utilizator pishcotMiruna Turbatu pishcot Data 26 octombrie 2019 09:18:11
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.08 kb
#include <bits/stdc++.h>
const int bomba = 1e9 + 6;
using namespace std;

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

int n, m, k, b[1005][1005]; /// b[i][j] dist min de la i j la un dragon
char a[1005][1005];
pair<int, int> v[1000005];
bitset<1003> c[1003];

int xi, yi, xf, yf;

void Read()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> (a[i] + 1);
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            if(a[i][j] == 'I')
            {
               xi = i;
               yi = j;
            }
            else if(a[i][j] == 'O')
            {
                xf = i;
                yf = j;
            }


}

void Bordare()
{
    int i , j;
    for(int i = 0; i <= n + 1; i++) ///coloanele 0 si m + 1 bordate
        a[i][0] = a[i][m + 1] = '*';
    for(int i = 1; i <= m + 1; i++)
        a[0][i] = a[m + 1][i] = '*';

}

void Initial()
{
    int i , j;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= m; j++)
            if(a[i][j] == 'D')
            {
                    b[i][j] = 0;
                    k++;
                    v[k] = {i,j};
            }
            else b[i][j] = bomba;
}

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] > b[i][j] + 1)
        {
            b[x][y] = b[i][j] + 1;
            k++;
            v[k] = {x , y};
        }

        ///sud
        x = i + 1;
        y = j;
        if(a[x][y] != '*' && b[x][y] > b[i][j] + 1)
        {
            b[x][y] = b[i][j] + 1;
            k++;
            v[k] = {x , y};
        }

        ///est
        x = i;
        y = j + 1;
        if(a[x][y] != '*' && b[x][y] > b[i][j] + 1)
        {
            b[x][y] = b[i][j] + 1;
            k++;
            v[k] = {x , y};
        }

        ///vest
        x = i;
        y = j - 1;
        if(a[x][y] != '*' && b[x][y] > b[i][j] + 1)
        {
            b[x][y] = b[i][j] + 1;
            k++;
            v[k] = {x , y};
        }

    }
}

///verific daca pot ajunge de la i la o mergand doar pe val >= val
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);
    }
}

void Rezolva()
{
    int Val;
    for(Val = b[xi][yi]; Val >= 1; Val--)
    {
        for(int i = 1; i <= n; i++)
            c[i].reset();
        Fill(xi,yi,Val);
        if(c[xf][yf] == 1)
        {
            fout << Val << "\n";
            fout.close();
            return;
        }
    }
    fout <<"-1\n";
    fout.close();
}

int main()
{
    Read();
    Bordare();
    Initial();
    Distante();
    Rezolva();
//    for(int i = 0; i <= n + 1; i++, cout << "\n")
//        for(int j = 0; j <= m + 1; j++)
//            cout << a[i][j];



    return 0;
}