Cod sursa(job #2911272)

Utilizator Maniu_DianaManiu Maria Diana Maniu_Diana Data 28 iunie 2022 11:45:49
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;
int ca[105][105];
char a[105][105];
int sol;
int sti, stj, opi, opj;

queue < pair < int, int> > Q;

int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

// -1 perete  0 drum  E iesire
void read()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
        {
            fin >> a[i][j];
            if(a[i][j] == '.')
                ca[i][j] = -2;
            if(a[i][j] == 'I')
            {
                ca[i][j] = -3;
                sti = i;
                stj = j;
            }
            if(a[i][j] == '*')
                ca[i][j] = -1;
            if(a[i][j] == 'D')
            {
                Q.push(make_pair(i, j));
                ca[i][j] = 0;
            }
            if(a[i][j] == 'O')
            {
                ca[i][j] = -4;
                opi = i;
                opj = j;
            }
        }
}

bool valid(int i, int j)
{
    return (i > 0 && i <= n && j > 0 && j <= m && ca[i][j] != -1);
}

void Lee()
{
    while(!Q.empty())
    {
        int l = Q.front().first;
        int c = Q.front().second;
        Q.pop();
        for(int i = 0; i < 4; i ++)
        {
            int lin = dx[i] + l;
            int col = dy[i] + c;
            if(valid(lin, col) && ca[lin][col] == -2)
            {
                ca[lin][col] = ca[l][c] + 1;
                Q.push(make_pair(lin, col));
            }
        }
    }
}


void afis()
{
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
            cout << ca[i][j] << " ";
        cout << endl;
    }
}

void Fill(int i, int j, int x) ///parcurgi matricea pe elemente mai mari sau egale cu x
{
    if(valid(i, j) && (ca[i][j] >= x || ca[i][j] == -3 || ca[i][j] == -4))
    {
        ca[i][j] = -5;
        for(int k = 0; k < 4; k ++)
            Fill(i + dx[k], j + dy[k], x);
    }
}

///daca pot ajunge de la i la O mergand doar pe ca[tx][ty] >= x
bool Check(int x)
{
    Fill(sti, stj, x);
    if(ca[opi][opj] == -5)
        return true;
    return false;
}

void cpy(int A[][105], int B[][105])
{
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
            A[i][j] = B[i][j];
}

int main()
{
    read();
    Lee();
//    afis();
//    cout << endl;

    int copie[105][105];
    cpy(copie, ca);

    int st = 1, dr = n * m, mij, val = 0;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(Check(mij))
        {
            st = mij + 1;
            val = mij;
        }
        else
            dr = mij - 1;
        cpy(ca, copie);
    }
    fout << val;

    return 0;
}