Pagini recente » Diferente pentru blog/think-online intre reviziile 6 si 7 | Rezultatele filtrării | Borderou de evaluare (job #1722250) | Cod sursa (job #564343) | Cod sursa (job #2303106)
#include <bits/stdc++.h>
using namespace std;
#define NMAX 1003
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
int n, m, X, Y, I, J, st = 1, dr = 1013, ans;
int dist [NMAX][NMAX];
bitset <NMAX> vizitat [NMAX], v [NMAX];
int di [4] = {0 , 1 , 0 , -1};
int dj [4] = {1 , 0 , -1 , 0};
string s;
queue <pair <int , int> > Quadda;
bool valid (int x , int y){
if (x > 0 && x <= n && y > 0 && y <= m)return 1;
return 0;
}
void LeeDragon (){
while (!Quadda.empty ()){
int l = Quadda.front ().first;
int c = Quadda.front ().second;
Quadda.pop ();
for (int k = 0; k < 4; k ++){
int L = l + di [k];
int C = c + dj [k];
if (valid (L, C) && !v [L][C] && !vizitat [L][C]){
dist [L][C] = dist [l][c] + 1;
vizitat [L][C] = 1;
Quadda.push ({L, C});
}
}
}
}
int LeePaftenie (int d){
if (dist [X][Y] < d)return 0;
while (!Quadda.empty ())Quadda.pop ();
memset (vizitat, 0, sizeof vizitat);
Quadda.push ({X, Y});
vizitat [X][Y] = 1;
while (!Quadda.empty ()){
int l = Quadda.front ().first;
int c = Quadda.front ().second;
Quadda.pop ();
for (int k = 0; k < 4; k ++){
int L = l + di [k];
int C = c + dj [k];
if (L == I && C == J && dist [L][C] >= d)return 1;
if (valid (L, C) && !v [L][C] && !vizitat [L][C] && dist [L][C] >= d){
vizitat [L][C] = 1;
Quadda.push ({L, C});
}
}
}
return 0;
}
int main (){
fin >> n >> m;
for (int i = 1; i <= n; i ++){
fin >> s;
for (int k = 0; k < m; k ++){
if (s [k] == 'I')X = i, Y = k + 1;
else if (s [k] == 'O')I = i, J = k + 1;
else if (s [k] == 'D')vizitat [i][k + 1] = 1, Quadda.push ({i, k + 1});
else if (s [k] == '*')v [i][k + 1] = 1;
}
}LeeDragon ();
while (st <= dr){
int mij = (st + dr) / 2;
if (LeePaftenie (mij))st = mij + 1, ans = mij;
else dr = mij - 1;
}
if (ans)fout << ans;
else fout << -1;
return 0;
}