Cod sursa(job #2366246)
Utilizator | 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;
}