Cod sursa(job #2289940)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 25 noiembrie 2018 15:43:16
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<stdio.h>
#define mod 3999988
int i, j, n, m, a[1100][1100], b[1100][1100], k, ii, ij, fi, fj, max = 0, viz[2000000], val, ok;
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };

struct nod
{
	int x, y;
}p[5000000];

char s[1100][1100];


void compara(int i, int j)
{
	for (int t = 0; t < 4; t++) {
		int i1 = i + dx[t];
		int j1 = j + dy[t];
		if (i1 <= n && i1 > 0 && j1 <= m && j1 > 0)
		{
			if ((b[i1][j1] == 0 || b[i1][j1] > b[i][j] + 1) && (s[i1][j1] != 'D'))
			{
				b[i1][j1] = b[i][j] + 1;
				p[++k].x = i1;
				p[k].y = j1;
			}
		}
	}

}

int ver(int i, int j)
{
	if (b[i][j] >= val && s[i][j] != '*'&&s[i][j] != 'D')
	{
		viz[(i - 1) * 1001 + j] = val;

		if (i == fi && j == fj && val > max) {
			max = val;
			ok = 1;
		}
		else for (int t = 0; t < 4; ++t) {
			int i1 = i + dx[t];
			int j1 = j + dy[t];
			if (i1 <= n && i1 > 0 && j1 <= m && j1 > 0)
				if (viz[(i1 - 1) * 1001 + j1] != val) ver(i1, j1);
		}
	}
	return 0;
}



int cautbin()
{
	int st = 1, dr = 1100, mij = 0;

	while (st <= dr) {
		mij = (st + dr) / 2;
		val = mij;
		ok = 0;
		ver(ii, ij);
		if (ok) st = mij + 1;
		else dr = mij - 1;
	}
	return 0;
}

int main()
{
	freopen("barbar.in", "r", stdin);
	freopen("barbar.out", "w", stdout);

	scanf("%d %d", &n, &m);

	for (i = 1; i <= n; i++)
	{
		scanf("%s", s[i] + 1);
		for (j = 1; j <= m; j++) {
			if (s[i][j] == '*') b[i][j] = -1;
			else if (s[i][j] == 'D') {
				p[++k].x = i;
				p[k].y = j;
			}
			else if (s[i][j] == 'I') {
				ii = i;
				ij = j;
			}
			else if (s[i][j] == 'O') {
				fi = i;
				fj = j;
			}
		}
	}
	for (i = 1; i <= k; i++) {
		compara(p[i].x, p[i].y);
	}


	cautbin();

	printf("%d\n", max);

	fclose(stdin);
	fclose(stdout);

	return 0;
}