Pagini recente » Cod sursa (job #1600375) | Cod sursa (job #2603574) | Cod sursa (job #974796) | Cod sursa (job #366415) | Cod sursa (job #2364430)
#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;
}