Cod sursa(job #2341251)

Utilizator skoda888Alexandru Robert skoda888 Data 11 februarie 2019 18:23:50
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb


#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
#include <climits>



const int RCMAX = 1005;
const int INF = INT_MAX;
const int DREAPTAMAX = 1000005;

const int drow[4] = { -1, 0, 1, 0 };
const int dcol[4] = { 0, 1, 0, -1 };


struct Coord {

	int i;
	int j;
	int d;

};


char Grid[RCMAX][RCMAX];
int  Dist[RCMAX][RCMAX];

std::queue <Coord> Coada;
std::vector<Coord> FromTo;


void DeterminareDistanteDragoni(int R, int C) {


	
	do {

		Coord NodCurent = Coada.front();
		Coada.pop();

		for (int dir = 0; dir < 4; ++dir) {
			Coord Tmp = { NodCurent.i + drow[dir], NodCurent.j + dcol[dir], NodCurent.d + 1 };
			//std::cout << 1;
			if (Dist[Tmp.i][Tmp.j] == -1 && (Grid[Tmp.i][Tmp.j] != '.' || Grid[Tmp.i][Tmp.j] != 'I' || Grid[Tmp.i][Tmp.j] != 'O')) {
				Dist[Tmp.i][Tmp.j] = Tmp.d;
				Coada.push(Tmp);
			}
		}

	} while (!Coada.empty());
}

bool Buna(int x) {

	std::queue<Coord> Coada2;
	Coada2.push(FromTo[0]);
	bool viz[RCMAX][RCMAX] = {};

	do {

		Coord NodCurent = Coada2.front();
		Coada2.pop();

		for (int dir = 0; dir < 4; ++dir) {
			Coord Tmp = {NodCurent.i + drow[dir], NodCurent.j + dcol[dir], 0};

			if (Tmp.i == FromTo[1].i && Tmp.j == FromTo[1].j) {
				return true;
			}

			if (Dist[Tmp.i][Tmp.j] >= x && !viz[Tmp.i][Tmp.j]) {
				Coada2.push(Tmp);
				viz[Tmp.i][Tmp.j] = true;
			}
		}


	} while (!Coada2.empty());

	return false;
}


int CautareBinaraSolutie() {

	int st = 0;
	int dr = DREAPTAMAX;
	int sol = -1;
	while (st <= dr) {
		int mijloc = (st + dr) / 2;

		if (Buna(mijloc)) {
			//std::cout << mijloc << ' ';
			//Incerc sa caut o solutie si mai mica
			st = mijloc + 1;
			sol = mijloc;
		}
		else {
			dr = mijloc - 1;
		}
	}

	return sol;
}



int main() {

	std::ifstream in("barbar.in");
	std::ofstream out("barbar.out");


	int R, C;
	in >> R >> C;
	memset(Dist, -1, sizeof Dist);

	for (int i = 1; i <= R; ++i) {
		for (int j = 1; j <= C; ++j) {
			in >> Grid[i][j];

			if (Grid[i][j] == 'D') {
				Coada.push({ i, j, 0 });
				Dist[i][j] = 0;
			}
			if (Grid[i][j] == 'I' || Grid[i][j] == 'O') {
				FromTo.push_back({ i, j, 0 });
			}
		}
	}


	DeterminareDistanteDragoni(R, C);
	out << CautareBinaraSolutie();


	system("PAUSE");
	return 0;
}