Cod sursa(job #2289941)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 25 noiembrie 2018 15:48:10
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <queue>
#include <cstring>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

int n, m, dx[4] = { -1,0,1,0 },
dy[4] = { 0,-1,0,1 }, d[1003][1003], st = 1050, dr;

char s[1003][1003];

struct element {
	int x, y;
}inceput, sfarsit;
bool b[1003][1003];

queue<element> stiva;

bool corect(int m1)
{
	memset(b, 0, sizeof(b));
	if (d[inceput.x][inceput.y] < m1)
	{
		return 0;
	}

	b[inceput.x][inceput.y] = 1;
	stiva.push(inceput);
	while (!stiva.empty()) {
		element a;
		a = stiva.front();
		stiva.pop();
		for (int t = 0; t < 4; t++) {
			int ivec = a.x + dx[t];
			int jvec = a.y + dy[t];
			if (s[ivec][jvec] != '*' && s[ivec][jvec] != 'D' && d[ivec][jvec] >= m1
				&& ivec >= 1 && ivec <= n && jvec >= 1 && jvec <= m && b[ivec][jvec] == 0) {
				b[ivec][jvec] = 1;
				element c;
				c.x = ivec;
				c.y = jvec;
				stiva.push(c);
			}
		}
	}
	if (b[sfarsit.x][sfarsit.y]) return 1;
	return 0;
}

int main()
{
	f >> n >> m;
	for (int i = 1; i <= n; i++)

		for (int j = 1; j <= m; j++) {
			f >> s[i][j];
			if (s[i][j] == 'D') {
				element a;
				a.x = i;
				a.y = j;
				stiva.push(a);
			}
			else if (s[i][j] == 'I') inceput.x = i, inceput.y = j;
			else if (s[i][j] == 'O') sfarsit.x = i, sfarsit.y = j;
		}

	while (!stiva.empty()) {
		element a;
		a = stiva.front();
		stiva.pop();

		for (int t = 0; t < 4; t++) {
			int ivec = a.x + dx[t];
			int jvec = a.y + dy[t];
			if (s[ivec][jvec] != '*' && s[ivec][jvec] != 'D' && (d[ivec][jvec] == 0 || d[ivec][jvec] > d[a.x][a.y] + 1)
				&& (ivec >= 1 && ivec <= n && jvec >= 1 && jvec <= m))
			{
				d[ivec][jvec] = d[a.x][a.y] + 1;
				dr = max(dr, d[ivec][jvec]);
				st = min(st, d[ivec][jvec]);
				element b;
				b.x = ivec;
				b.y = jvec;
				stiva.push(b);
			}
		}
	}

	/*for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++) g << d[i][j] << ' ';
		g << '\n';
	}*/
	//g << '\n';
	//g << st << ' ' << dr << '\n';

	int rez = 0;
	st = 1;
	while (st < dr) {
		int m = (st + dr) / 2;
		//g << m << ' ';
		if (corect(m)) st = m+1, rez = m;
		else dr = m - 1;
	}
//	g << '\n';
	g << rez << '\n';
	return 0;
}