Cod sursa(job #2364430)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 4 martie 2019 08:31:12
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <bits/stdc++.h>
using namespace std;
const int lin[] = {0, 0, -1, 1};
const int col[] = {1, -1, 0, 0};
int Ln, Cl, i, j, nrfantani, poz1, poz2, c, ii, n, m;
bool imposibil, marcel, fantana, viz[105][105];
char v[105][105];
struct pozitie
{
    int ln;
    int cl;
}aux, aux1;
deque <pozitie> Q;
void Lee(int i, int j)
{
    poz1 = poz2 = 0;
    aux.ln = i;
    aux.cl = j;
    marcel = false;
    fantana = false;
    if(v[i][j] == 'M')marcel = true;
    if(v[i][j] == '@')fantana = true;
    Q.push_back(aux);
    while(!Q.empty())
    {
        aux = Q.front();
        Q.pop_front();
        if(v[aux.ln][aux.cl] == '.')poz1 = aux.ln, poz2 = aux.cl;
        for(int i = 0; i < 4; i ++)
        {
            Ln = aux.ln + lin[i];
            Cl = aux.cl + col[i];
            if(viz[Ln][Cl] == false && v[Ln][Cl] != '#')
            {
                if(v[Ln][Cl] == 'M')marcel = true;
                if(v[Ln][Cl] == '@')fantana = true;
                viz[Ln][Cl] = true;
                aux1.ln = Ln;
                aux1.cl = Cl;
                Q.push_back(aux1);
            }
        }
    }
    if(fantana == false)
    {
        if(poz1 == 0 && poz2 == 0 && marcel == true)imposibil = true;
        else if(marcel == true)nrfantani++, v[poz1][poz2] = '@';
    }
}
int main()
{
    ifstream f("marceland.in");
    ofstream g("marceland.out");
    f >> c;
    for(ii = 1; ii <= c; ii ++)
    {
        f >> n >> m;
        nrfantani = 0;
        for(i = 1; i <= n; i ++)
            for(j = 1; j <= m; j ++)
                f >> v[i][j];
        for(i = 0; i <= n + 1; i ++)
            v[i][0] = v[i][m + 1] = '#';
        for(j = 0; j <= m + 1; j ++)
            v[0][j] = v[n + 1][j] = '#';
        imposibil = false;
        for(i = 1; i <= n; i ++)
            for(j = 1; j <= m; j ++)
                if(viz[i][j] == false && v[i][j] != '#')
                {
                    viz[i][j] = true;
                    Lee(i, j);
                    if(imposibil == true)break;
                }
        if(imposibil == true)
        {
            g << "-1" << "\n";
            continue;
        }
        g << nrfantani << "\n";
        for(i = 1; i <= n; i ++)
        {
            for(j = 1; j <= m; j ++)
                g << v[i][j];
            g << "\n";
        }
        for(i = 1; i <= n; i ++)
            for(j = 1; j <= m; j ++)
                viz[i][j] = false;
    }
    return 0;
}