Cod sursa(job #3201858)

Utilizator CraiuAndreiCraiu Andrei David CraiuAndrei Data 9 februarie 2024 22:23:42
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("miting.in");
ofstream fout("miting.out");

int n, m, C, a[100][100], nrl, sol, r;
char cuv[12],s;
int sus, jos, st, dr;
struct Pozitii {
	int x, y;
}v[12];
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };
queue<pair<int, int>>q;
bool viz[100][100];
int mat[100][100];

int Innit(int x, int y)
{
	return (x >= 1 && x <= n && y >= 1 && y <= m);
}

void Clean()
{
	int i, j;
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++)viz[i][j] = mat[i][j] = 0;
}

int Lee(int i, int j)
{
	int x, y, k;
	Clean();
	q.push(make_pair(i, j));
	mat[i][j] = 1;
	viz[i][j] = 1;
	while (!q.empty())
	{
		i = q.front().first;
		j = q.front().second;
		for (k = 0; k < 4; k++)
		{
			x = dx[k] + i;
			y = dy[k] + j;
			if (Innit(x, y) && (viz[x][y] == 0 || mat[x][y] > mat[i][j] + 1) && a[x][y]!=-1)
			{
				viz[x][y] = 1;
				mat[x][y] = mat[i][j] + 1;
				q.push(make_pair(x, y));;
			}
		}
		q.pop();
	}
	return 0;
}

void Afis()
{
	int i, j;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
			fout << mat[i][j] << " ";
		fout << "\n";
	}
	fout << "\n";
}

int main()
{
	int i, j, k;
	fin >> C >> n >> m;
	fin >> cuv;
	jos = st = 100;
	sus = dr = 0;
	for(i=1;i<=n;i++)
		for (j = 1; j <= m; j++)
		{
			fin >> s;
			if (s == '_')a[i][j] = 0;
			else if (s == '#')a[i][j] = -1;
			else if (s >= 'A' && s <= 'Z')
			{
				Lee(i, j);
				a[i][j] = 1;
				nrl++;
				v[nrl].x = i;
				v[nrl].y = j;
				if (i < jos)jos = i;
				if (i > sus)sus = i;
				if (j > dr)dr = j;
				if (j < st)st = j;
			}
		}
	if (C == 1)
	{
		fout << (sus - jos + 1) * (dr - st + 1)<<"\n";
		return 0;
	}
	r = 1e9;
	for (i = 1; i <= n; i++)
		for (j = 1; j <= m; j++)
			if (a[i][j] != -1)
			{
				Lee(i, j);
				sol = 0;
				for (k = 1; k <= nrl; k++)
				{
					if (mat[v[k].x][v[k].y] != 0)
						sol += mat[v[k].x][v[k].y];
					else
					{
						sol = 0;
						break;
					}
				}
				if (sol-nrl < r && sol!=0)r = sol - nrl;
			}
	fout << r;
	return 0;
}