Cod sursa(job #2033518)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 6 octombrie 2017 22:01:26
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#define DM 1010
#include <cstring>
#include <fstream>
#include <queue>
using namespace std;

ifstream fi ("barbar.in");
ofstream fo ("barbar.out");
char c[DM][DM];
int n, m, dist[DM][DM], a, b, di[4] = {-1, 0, 1, 0}, dj[4] = {0, 1, 0, -1}, viz[DM][DM], endi, endj;
queue <pair <int, int> > q;
pair <int, int> v;

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

int bfs(int x)
{
	if (x > dist[v.first][v.second])
		return 0;
	for (int i = 1; i <= n; ++i)
		memset(viz[i], 0, DM);
	q.push(v);
	viz[v.first][v.second] = dist[v.first][v.second];
	while (!q.empty())
	{
		a = q.front().first, b = q.front().second;
		q.pop();
		for (int i = 0; i < 4; ++i)
			if (ok(a + di[i], b + dj[i]) && !viz[a+di[i]][b+dj[i]] && dist[a+di[i]][b+dj[i]] >= x && c[a+di[i]][b+dj[i]] != '*')
			{
				viz[a+di[i]][b+dj[i]] = dist[a+di[i]][b+dj[i]];
				q.push({a + di[i], b + dj[i]});
			}
	}
	if (viz[endi][endj])
		return 1;
	return 0;
}

int binar()
{
	int hi = n*m, lo = 1, mid;
	while (hi > lo)
	{
		mid = (lo + hi + 1)/2;
		if (bfs(mid))
			lo = mid;
		else
			hi = mid - 1;
	}
	return lo;
}

int main()
{
	fi >> n >> m;
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= m; ++j)
		{
			fi >> c[i][j];
			if (c[i][j] != '*')
				dist[i][j] = (1<<30);
			if (c[i][j] == 'D')
			{
				dist[i][j] = 1;
				q.push({i, j});
			}
			else if (c[i][j] == 'I')
				v = {i, j};
			else if (c[i][j] == 'O')
				endi = i, endj = j;
		}
	while (!q.empty())
	{
		a = q.front().first, b = q.front().second;
		q.pop();
		for (int i = 0; i < 4; ++i)
			if (ok(a + di[i], b + dj[i]) && dist[a+di[i]][b+dj[i]] > dist[a][b] + 1 && c[a+di[i]][b+dj[i]] != '*')
			{
				dist[a+di[i]][b+dj[i]] = dist[a][b] + 1;
				q.push({a + di[i], b + dj[i]}); 
			}
	}
	if (!bfs(1))
	{
		fo << -1;
		return 0;
	}
	fo << binar() - 1;
	return 0;
}