Cod sursa(job #2366246)

Utilizator bodea.georgianaBodea Georgiana bodea.georgiana Data 4 martie 2019 19:11:07
Problema Diametrul unui arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.08 kb
#include <cstdio>
#include <deque>

using namespace std;
FILE *f,*g;

int a[102][102],n,m,iaz,nisip,ln,cn;
struct bla
{
    int lin,col;
}v[102*102];
bla dir[6]={{0,-1},{-1,0},{0,1},{1,0}};
deque <bla> q;
bool viz[102][102];

void lee(int om)
{
    int x,y,xx,yy;
    q.push_back({v[om].lin,v[om].col});
    viz[v[om].lin][v[om].col]=1;
    while(!q.empty())
    {
        x=q.front().lin;
        y=q.front().col;
        q.pop_front();
        for(int k=0;k<=3;++k)
        {
            xx=x+dir[k].lin;
            yy=y+dir[k].col;
            if(a[xx][yy]==-2)
            {
                iaz=1;
                return;
            }
            else
            {
                if(xx>=1 && xx<=m && yy>=1 && yy<=n)
                {
                    if(!viz[xx][yy] && (!a[xx][yy] || a[xx][yy]==1))
                    {
                        viz[xx][yy]=1;
                        if(!a[xx][yy])
                        {nisip=1;
                        ln=xx;
                        cn=yy;}
                        q.push_back({xx,yy});
                    }
                }
            }
        }
    }
}
int main()
{
    f=fopen("marceland.in","r");
    g=fopen("marceland.out","w");
    int t,nrm,nrf,ok;
    char ch;
    fscanf(f,"%d",&t);
    while(t--)
    {
        fscanf(f,"%d %d",&m,&n);
        ch=fgetc(f);
        nrm=nrf=ok=0;
        for(int i=1;i<=m;++i)
        {
            for(int j=1;j<=n;++j)
            {
                ch=fgetc(f);
                if(ch=='#')
                    a[i][j]=-1;
                else
                    if(ch=='M')
                        a[i][j]=1,v[++nrm]={i,j};
                    else
                        if(ch=='@')
                            a[i][j]=-2;
                        else
                            a[i][j]=0;
            }
            ch=fgetc(f);
        }

        for(int i=1;i<=nrm;++i)
        {
            iaz=nisip=0;
            lee(i);
            while(!q.empty())
                q.pop_back();
            for(int j=1;j<=m;++j)
                for(int k=1;k<=n;++k)
                    viz[j][k]=0;
            if(!iaz)
            {
                if(nisip)
                    a[ln][cn]=-2,++nrf;
                else
                {
                    ok=-1;
                    fprintf(g,"-1\n");
                    break;
                }
            }
        }
        if(ok!=-1)
        {
            fprintf(g,"%d\n",nrf);
            for(int i=1;i<=m;++i)
            {
                for(int j=1;j<=n;++j)
                    if(!a[i][j])
                        fprintf(g,".");
                    else
                        if(a[i][j]==-2)
                            fprintf(g,"@");
                        else
                            if(a[i][j]==-1)
                                fprintf(g,"#");
                            else
                                fprintf(g,"M");
                fprintf(g,"\n");
            }
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}