Pagini recente » Cod sursa (job #1999092) | Cod sursa (job #2807712) | Cod sursa (job #634076) | Cod sursa (job #2574682) | Cod sursa (job #1609472)
#include <utility>
#include <fstream>
#include <cstring>
#include <queue>
#define NMAX 1004
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n , m , d[NMAX][NMAX] , c[NMAX][NMAX] , xs , ys , xf , yf , DM;
char mat[NMAX][NMAX];
int dx[] = {-1 , 0 , 1 , 0};
int dy[] = {0 , 1 , 0 , -1};
queue <pair <int , int> > coada;
int caut_bin();
int verif(int val);
int main() {
f >> n >> m;
for(int i = 1 ; i <= n ; ++i) {
for(int j = 1 ; j <= m ; ++j) {
f >> mat[i][j];
}
}
for(int i = 1 ; i <= n ; ++i) {
for(int j = 1 ; j <= m ; ++j) {
if(mat[i][j] == 'D') {
coada.push(make_pair(i , j));
}
if(mat[i][j] == 'I') {
xs = i;
ys = j;
d[i][j] = NMAX;
}
if(mat[i][j] == 'O') {
xf = i;
yf = j;
d[i][j] = NMAX;
}
}
}
DM = max(n , m);
while(!coada.empty()) {
pair <int , int> aux = coada.front();
coada.pop();
for(int i = 0 ; i < 4 ; ++i) {
if(d[aux.first + dx[i]][aux.second + dy[i]] == 0 && mat[aux.first + dx[i]][aux.second + dy[i]] == '.') {
d[aux.first + dx[i]][aux.second + dy[i]] = d[aux.first][aux.second] + 1;
coada.push(make_pair(aux.first + dx[i] , aux.second + dy[i]));
}
}
}
g << caut_bin();
return 0;
}
int caut_bin() {
int i , p = 0;
for(i = 1 ; i <= DM ; i <<= 1);
while(i) {
if(verif(p + i)) {
p += i;
}
i >>= 1;
}
if(p == 0) {
return -1;
}
return p;
}
int verif(int val) {
memset(c , 0 ,sizeof(c));
while(!coada.empty()) {
coada.pop();
}
coada.push(make_pair(xs , ys));
while(!coada.empty()) {
pair <int , int> aux = coada.front();
if(aux.first == xf && aux.second == yf) {
return 1;
}
coada.pop();
for(int i = 0 ; i < 4 ; ++i) {
if(c[aux.first + dx[i]][aux.second + dy[i]] == 0 && d[aux.first + dx[i]][aux.second + dy[i]] >= val && (mat[aux.first + dx[i]][aux.second + dy[i]] == '.' || mat[aux.first + dx[i]][aux.second + dy[i]] == 'O')) {
c[aux.first + dx[i]][aux.second + dy[i]] = c[aux.first][aux.second] + 1;
coada.push(make_pair(aux.first + dx[i] , aux.second + dy[i]));
}
}
}
if(c[xf][yf] != 0) {
return 1;
}
return 0;
}