Pagini recente » Cod sursa (job #2256316) | Cod sursa (job #2648173) | Rating Bocean Vlad (vLaDy198) | Rating Virtan Alina-Elena (VirtanAlinaElena) | Cod sursa (job #1779526)
#include<fstream>
#include<deque>
#include<cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[1005][1005], dist[1005][1005], is, js, ifin, jfin, f[1005][1005], n, m, st, dr, mid;
deque< pair<int,int> > v;
int di[] = { 0, 0, 1, -1 };
int dj[] = { 1, -1, 0, 0 };
char c;
int inmat( int x, int y ){
if( 1 <= x && x <= n && 1 <= y && y <= m ){
return 1;
}
return 0;
}
int bfs( int val ){
memset( f, 0, sizeof(f) );
v.clear();
v.push_back( make_pair( is, js ) );
f[is][js] = 1;
while( !v.empty() ){
int ic = v.front().first;
int jc = v.front().second;
for( int d = 0; d <= 3; d++ ){
int iv = ic + di[d];
int jv = jc + dj[d];
if( inmat( iv, jv ) == 1 && a[iv][jv] == 0 && f[iv][jv] == 0 && dist[iv][jv] >= val ){
f[iv][jv] = 1;
v.push_back( make_pair( iv, jv ) );
if( iv == ifin && jv == jfin ){
return 1;
}
}
}
v.pop_front();
}
return 0;
}
int main(){
fin >> n >> m;
memset( dist, 0x3f3f3f3f, sizeof(dist) );
for( int i = 1; i <= n; i++ ){
for( int j = 1; j <= m; j++ ){
fin >> c;
if( c == '*' )
a[i][j] = 1;
if( c == 'D' ){
v.push_back( make_pair(i,j) );
dist[i][j] = 0;
}
if( c == 'I' ){
is = i;
js = j;
}
if( c == 'O' ){
ifin = i;
jfin = j;
}
}
}
//calculez distantele
while( !v.empty() ){
int ic = v.front().first;
int jc = v.front().second;
for( int d = 0; d <= 3; d++ ){
int iv = ic + di[d];
int jv = jc + dj[d];
if( inmat( iv, jv ) == 1 && a[iv][jv] == 0 && dist[iv][jv] > dist[ic][jc] + 1 ){
dist[iv][jv] = dist[ic][jc] + 1;
v.push_back( make_pair( iv, jv ) );
}
}
v.pop_front();
}
//caut binar distanta maxima posibila
st = 0;
dr = max( n, m );
while( st <= dr ){
mid = ( st + dr ) / 2;
if( bfs( mid ) == 1 ){
st = mid + 1;
}else{
dr = mid - 1;
}
}
fout << -1 << "\n";
return 0;
}