Cod sursa(job #3122580)

Utilizator unomMirel Costel unom Data 19 aprilie 2023 17:52:04
Problema Fructe Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.8 kb
#include <fstream>
#include <queue>

using namespace std;

ifstream in("marceland.in");
ofstream out("marceland.out");
int t, n, m;
int v[103][103];
int d[103][103];
int zone[10005];
int di[] = {1, -1, 0, 0};
int dj[] = {0, 0, 1, -1};
int yes = 0;

void fil(int i, int j, int val)
{
    queue <pair<int, int>> q;
    q.push({i, j});
    d[i][j] = val;

    if(v[i][j] == 3)
    {
        zone[val] = 1;
    }
    else if(v[i][j] == 4)
    {
        yes = 1;
    }

    int iv, jv;
    int x, y;

    while(!q.empty())
    {
        iv = q.front().first;
        jv = q.front().second;

        for(int i = 0; i<4; i++)
        {
            x = iv + di[i];
            y = jv + dj[i];

            if(x >= 1 && x <= n && y >= 1 && y <= m && d[x][y] == 0)
            {
                if(v[x][y] == 3)
                {
                    zone[val] = 1;
                }
                else if(v[x][y] == 4)
                {
                    yes = 1;
                }
                d[x][y] = val;
                q.push({x, y});
            }
        }
        q.pop();
    }
}

int main()
{
    in>>t;

    while(t--)
    {

        for(int i = 1; i<=10000; i++)
        {
            zone[i] = 0;
        }

        in>>n>>m;
        string s;
        for(int i = 1; i<=n; i++)
        {
            in>>s;
            for(int j = 0; j<m; j++)
            {
                if(s[j] == '#')
                {
                    v[i][j+1] = 1;
                    d[i][j+1] = -1;
                }
                else
                {
                    d[i][j+1] = 0;

                    if(s[j] == '.')
                    {
                        v[i][j+1] = 2;
                    }
                    else if(s[j] == '@')
                    {
                        v[i][j+1] = 3;
                    }
                    else if(s[j] == 'M')
                    {
                        v[i][j+1] = 4;
                    }
                }
            }
        }

        int z = 0;
        for(int i = 1; i<=n; i++)
        {
            for(int j = 1; j<=m; j++)
            {
                if(d[i][j] == 0)
                {
                    z++;
                    yes = 0;
                    fil(i, j, z);

                    if(yes == 0)
                    {
                        zone[z] = 1;
                    }
                }
            }
        }

        int ans = 0;

        for(int i = 1; i<=n; i++)
        {
            for(int j = 1; j<=m; j++)
            {
                if(d[i][j] != -1)
                {
                    if(zone[d[i][j]] == 0 && v[i][j] == 2)
                    {
                        v[i][j] = 3;
                        zone[d[i][j]] = 1;
                        ans++;
                    }
                }
            }
        }

        int ok = 1;

        for(int i = 1; i<=z; i++)
        {
            if(zone[i] == 0)
            {
                ok = 0;
                break;
            }
        }

        if(ok == 0)
        {
            out<<-1<<'\n';
            continue;
        }

        out<<ans<<'\n';

        for(int i = 1; i<=n; i++)
        {
            for(int j = 1; j<=m; j++)
            {
                if(v[i][j] == 1)
                {
                    out<<"#";
                }
                else if(v[i][j] == 2)
                {
                    out<<".";
                }
                else if(v[i][j] == 3)
                {
                    out<<"@";
                }
                else if(v[i][j] == 4)
                {
                    out<<"M";
                }
            }
            out<<'\n';
        }

    }
    return 0;
}