Pagini recente » Cod sursa (job #3348073) | Cod sursa (job #3353559) | Cod sursa (job #3333922) | Cod sursa (job #3315933) | Cod sursa (job #3353390)
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
#define MAX_N 1005
int mat[MAX_N][MAX_N], dist[MAX_N][MAX_N], viz[MAX_N][MAX_N], x, finishl, finishc, n, m, startl, startc, ldir[] = { -1, 0, 1, 0 }, cdir[] = { 0, 1, 0, -1 };
queue< pair<int, int> > q;
void bfs(){
int d, x, y, lin, col;
while( !q.empty() ){
x = q.front().first;
y = q.front().second;
q.pop();
for( d = 0; d < 4; d++ ){
lin = x + ldir[d];
col = y + cdir[d];
if( lin > 0 && lin <= n && col > 0 && col <= m && mat[lin][col] != 1 && dist[x][y] + 1 < dist[lin][col] ){
q.push(make_pair(lin, col));
dist[lin][col] = dist[x][y] + 1;
}
}
}
}
void check( int l, int c, int mid ){
int d, lin, col;
if( l == finishl && c == finishc ){
x = 1;
return;
}
viz[l][c] = 1;
for( d = 0; d < 4; d++ ){
lin = l + ldir[d];
col = c + cdir[d];
if( lin > 0 && lin <= n && col > 0 && col <= m && viz[lin][col] == 0 && dist[lin][col] >= mid && mat[l][c] != 1 ){
check( lin, col, mid );
}
}
}
int main(){
ifstream cin("barbar.in");
ofstream cout( "barbar.out");
int l, c, st, dr, mid, ans;
string s;
cin >> n >> m;
for( l = 1; l <= n; l++ ){
for( c = 1; c <= m; c++ )
dist[l][c] = INT_MAX;
}
for( l = 1; l <= n; l++ ){
cin >> s;
for( c = 1; c <= m; c++ ){
if( s[c - 1] == '*' )
mat[l][c] = 1;
else if( s[c - 1] == 'D' ){
mat[l][c] = 2;
q.push( make_pair(l, c) );
dist[l][c] = 0;
}
else if( s[c - 1] == 'I' ){
startl = l;
startc = c;
}
else if( s[c - 1] == 'O' ){
finishl = l;
finishc = c;
}
}
}
bfs();
/*for( l = 1; l <= n; l++ ){
for( c = 1; c <= m; c++ ){
cout << dist[l][c] << " ";
}
cout << "\n";
}*/
st = 0;
dr = n * m;
ans = -1;
while( st <= dr ){
mid = ( st + dr ) / 2;
x = 0;
for( l = 1; l <= n; l++ ){
for( c = 1; c <= m; c++ )
viz[l][c] = 0;
}
check( startl, startc, mid );
if( x == 1 ){
ans = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
cout << ans;
return 0;
}