Cod sursa(job #1242051)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 13 octombrie 2014 22:14:20
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<fstream>
using namespace std;
int n, m, i, j, p, u, p1, u1, ii, jj, iv, jv, ii1, jj1, ii2, jj2, mid, d;
int a[1002][1002], c[2][1000*1000+1];
char b[1002][1002];
int di[4] = {1, -1, 0, 0};
int dj[4] = {0, 0, 1, -1};
char x;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int main(){
	fin>> n >> m;
	p = 1;
	for(i = 1; i <= n; i++){
		for(j = 1; j <= m; j++){
			fin>> x;
			if(x == 'I'){
				ii1 = i;
				jj1 = j;
			}
			else{
				if(x == 'O'){
					ii2 = i;
					jj2 = j;
				}
				else{
					if(x == 'D'){
						u++;
						c[0][u] = i;
						c[1][u] = j;
						a[i][j] = 1;
					}
					else{
						if(x == '*'){
							a[i][j] = -1;
						}
					}
				}
			}
		}
	}
	while(p <= u){
		ii = c[0][p];
		jj = c[1][p];
		for(d = 0; d < 4; d++){
			iv = ii + di[d];
			jv = jj + dj[d];
			if(a[iv][jv] == 0 && iv >= 1 && iv <= n && jv >= 1 && jv <= m){
				a[iv][jv] = a[ii][jj] + 1;
				u++;
				c[0][u] = iv;
				c[1][u] = jv;
			}
		}
		p++;
	}
	p = 2;
	if(a[ii1][jj1] < a[ii2][jj2]){
		u = a[ii1][jj1];
	}
	else{
		u = a[ii2][jj2];
	}
	while(p <= u){
		mid = (p + u) / 2;
		p1 = 1;
		u1 = 1;
		c[0][1] = ii1;
		c[1][1] = jj1;
		while(p1 <= u1){
			ii = c[0][p1];
			jj = c[1][p1];
			for(d = 0; d < 4; d++){
				iv = ii + di[d];
				jv = jj + dj[d];
				if(a[iv][jv] >= mid && b[iv][jv] == 0){
					u1++;
					b[iv][jv] = 1;
					c[0][u1] = iv;
					c[1][u1] = jv;
				}
			}
			p1++;
			if(b[ii2][jj2] == 1){
				p = mid + 1;
				break;
			}
		}
		if(p1 <= u1){
			u = mid - 1;
		}
		for(i = 1; i <= n; i++){
			for(j = 1; j <= m; j++){
				b[i][j] = 0;
			}
		}
	}
	if(u < 2){
		fout<< -1;
		return 0;
	}
	fout<< u;
	return 0;
}