Pagini recente » Cod sursa (job #2904919) | Cod sursa (job #2314970) | Cod sursa (job #2083033) | Cod sursa (job #1368960) | Cod sursa (job #2341264)
#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] = {};
if (Dist[FromTo[0].i][FromTo[0].j] < x) {
return false;
}
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;
}