Cod sursa(job #2911243)

Utilizator Maniu_DianaManiu Maria Diana Maniu_Diana Data 27 iunie 2022 23:53:12
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.21 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 paf(int i, int j)
//{
//    if(i > 0 && i <= n && j > 0 && j <= m)
//       return;
//    if(ca[i][j] == -4)
//        return;
//    minim = min(minim,ca[i][j]);
//    ca[i][j] = INT_MIN;
//    int lin=i, col=j, ma = INT_MIN;
//    for(int k = 0; k < 4; k ++)
//    {
//        if(ma < ca[i + dx[k]][j + dy[k]] && (i + dx[k] > 0) && (i + dx[k] <= n) &&  (j + dy[k] > 0) && (j + dy[k] <= m))
//        {
//            ma = ca[i + dx[k]][j + dy[k]];
//            lin = i + dx[k];
//            col = j + dy[k];
//        }
//
//    }
//    //if(ma > minim)
//        //minim = ma;
//    paf(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 i = 1;
    do
    {
        i++;
        cpy(ca, copie);

    }while(!Check(i));

    fout << i;
    return 0;
}