Cod sursa(job #353912)

Utilizator Addy.Adrian Draghici Addy. Data 6 octombrie 2009 18:41:22
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <stdio.h>
#define DIM 1005

char A[DIM][DIM];
int viz[DIM][DIM];
int C[2][DIM*DIM], dist[DIM][DIM];
int di[] = {0, 0, -1, 1}, dj[] = {-1, 1, 0, 0};
int n, m, i, j, iv, jv, ip, jp, MAX, X1, X2, Y1, Y2, k, p, u, mj, sol;

FILE *f = fopen("barbar.in","r");
FILE *g = fopen("barbar.out","w");

void citeste() {
	fscanf(f, "%d %d", &n, &m);
	for (i = 1; i <= n; i++) {
		fscanf(f, "\n");
		for (j = 1; j <=m ; j++) {
			fscanf(f, "%c", &A[i][j]);
			if (A[i][j] == 'I')
				X1 = i, Y1 = j;
			if (A[i][j] == 'O')
				X2 = i, Y2 = j;
			if (A[i][j] == 'D') {
				u++;
				C[0][u] = i, C[1][u] = j;
				viz[i][j] = 1;
			}
		}
	}
}

void distante() {
	for (p = 1; p <= u; p++) {
		ip = C[0][p], jp = C[1][p];
		for (k = 0; k < 4; k++) {
			iv = ip + di[k];
			jv = jp + dj[k];
			if (A[iv][jv] != '*' && iv > 0 && iv <= n && jv > 0 && jv <= m) {
				if (!viz[iv][jv]) {
					u++;
					C[0][u] = iv, C[1][u] = jv;
					dist[iv][jv] = dist[ip][jp] + 1;
					if (dist[iv][jv] > MAX)
						MAX = dist[iv][jv];
					viz[iv][jv] = 1;
				}
				else
					if (dist[ip][jp] + 1 < dist[iv][jv])
						dist[iv][jv] = dist[ip][jp] + 1;
			}
		}
	}
}

void init() {
	for (i = 1; i <= n; i++)
		for (j = 1; j <= m; j++)
			viz[i][j] = 0;
}

int drum(int MIN) {
	int p, u;
	init();
	C[0][1] = X1, C[1][1] = Y1, viz[X1][Y1] = 1;
	if (dist[X1][Y1] < MIN) return 0;
	for (p = u = 1; p <= u; p++) {
		ip = C[0][p], jp = C[1][p];
		for (k = 0; k < 4; k++) {
			iv = ip + di[k];
			jv = jp + dj[k];
			if (A[iv][jv] != '*' && dist[iv][jv] >= MIN && !viz[iv][jv] && iv > 0 && iv <= n && jv > 0 && jv <= m) {
				u++;
				C[0][u] = iv, C[1][u] = jv;
				viz[iv][jv] = 1;
				if (iv == X2 && jv == Y2)
					return 1;
			}
		}
	}
	return 0;
}

int main() {
	
	citeste();
	
	distante();
	
	sol = -1;
	
	for (p = 0, u = MAX; p <= u; ) {
		mj = (u - p) / 2 + p;
		if ( drum(mj) ) {
			sol = mj;
			p = mj + 1;
		}
		else
			u = mj - 1;
	}
	
	fprintf(g, "%d", sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}