Cod sursa(job #3152255)

Utilizator lensuLensu Alexandru lensu Data 24 septembrie 2023 14:39:03
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream> 
#include <queue>

using namespace std;

ifstream cin("barbar.in");
ofstream cout("barbar.out");

int n, m, x, x2, y, y2;
int leed[1001][1001], a[1001][1001], mat[1001][1001];
int di[] = { 0,0,1,-1 };
int dj[] = { 1,-1,0,0 };

queue<pair<int, int>> d;

bool inmat(int i, int j)
{
	return i >= 1 && i <= n && j >= 1 && j <= m;
}

void LEED()
{
	while (!d.empty())
	{
		int is = d.front().first, js = d.front().second;
		d.pop();
		for (int k = 0; k < 4; k++)
		{
			int inou = is + di[k], jnou = js + dj[k];
			if (inmat(inou, jnou) && a[inou][jnou] != -1 && leed[inou][jnou] == 0)
				d.push({ inou,jnou }), leed[inou][jnou] = leed[is][js] + 1;
		}
	}
}

void clear(int b[1001][1001])
{
	for (int i = 0; i <= 1000; i++)
		for (int j = 0; j <= 1000; j++)
			b[i][j] = 0;
}

bool lee(int dist)
{
	clear(mat);
	queue<pair<int, int>> q;
	q.push({ x,y });
	while (!q.empty())
	{
		int is = q.front().first, js = q.front().second;
		q.pop();
		for (int k = 0; k < 4; k++)
		{
			int inou = is + di[k], jnou = js + dj[k];
			if (inmat(inou, jnou) && a[inou][jnou] != -1 && leed[inou][jnou] >= dist && mat[inou][jnou] == 0)
				q.push({ inou,jnou }), mat[inou][jnou] = mat[is][js] + 1;
		}
	}

	return (mat[x2][y2]);
}

int main()
{
	cin >> n >> m;

	for(int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
		{
			char c;
			cin >> c;
			if (c == 'D')
				d.push({ i,j }), leed[i][j] = 1, a[i][j] = -1;
			if (c == '*')
				a[i][j] = -1;
			if (c == 'I')
				x = i, y = j;
			if (c == 'O')
				x2 = i, y2 = j;
		}

	LEED();

	int st = 1, dr = 1e5, rez = -1;
	while (st <= dr)
	{
		int mij = (st + dr) / 2;
		if (lee(mij))
			rez = mij,st = mij + 1;
		else dr = mij - 1;
	}

	cout << (rez == -1 ? -1 : rez - 1);
}