Pagini recente » Cod sursa (job #1158333) | Cod sursa (job #1939754) | Cod sursa (job #1584801) | Cod sursa (job #2120709) | Cod sursa (job #2627767)
#include <fstream>
#include <cstdio>
#include <queue>
#define LIM 1000
using namespace std;
int T[LIM + 2][LIM + 2];
int dist[LIM + 2][LIM + 2];
char viz[LIM + 2][LIM + 2];
int mind[LIM + 2][LIM + 2];
queue<int> ql;
queue<int> qc;
int DX[4] = { 0, 1, 0, -1 };
int DY[4] = { 1, 0, -1, 0 };
int n, m;
void lee() {
int i, j, l, c, ln, cn;
for ( i = 1; i <= n; ++i ) {
for ( j = 1; j <= m; ++j ) {
if ( T[i][j] == 'D' ) {
ql.push( i );
qc.push( j );
viz[i][j] = 1;
dist[i][j] = 1;
}
}
}
while ( !ql.empty() ) {
l = ql.front();
c = qc.front();
ql.pop();
qc.pop();
for ( i = 0; i < 4; ++i ) {
ln = l + DX[i];
cn = c + DY[i];
if ( !viz[ln][cn] && (T[ln][cn] == '.' || T[ln][cn] == 'I' || T[ln][cn] == 'O') ) {
dist[ln][cn] = dist[l][c] + 1;
viz[ln][cn] = 1;
ql.push( ln );
qc.push( cn );
}
}
}
}
void leeMax( int lI, int cI, int lO, int cO ) {
int l = -1, c = -1, i, ln, cn;
ql.push( lI );
qc.push( cI );
viz[lI][cI] = 1;
mind[lI][cI] = dist[lI][cI];
while ( !ql.empty() && (l != lO || c != cO) ) {
l = ql.front();
c = qc.front();
ql.pop();
qc.pop();
for ( i = 0; i < 4; ++i ) {
ln = l + DX[i];
cn = c + DY[i];
if ( !viz[ln][cn] && (T[ln][cn] == '.' || T[ln][cn] == 'I' || T[ln][cn] == 'O') ) {
if ( mind[l][c] > dist[ln][cn] ) {
mind[ln][cn] = dist[ln][cn];
} else {
mind[ln][cn] = mind[l][c];
}
viz[ln][cn] = 1;
ql.push( ln );
qc.push( cn );
}
}
}
}
int main() {
FILE *fin = fopen( "barbar.in", "r" );
FILE *fout = fopen( "barbar.out", "w" );
int i, j, lI, cI, lO, cO;
fscanf( fin, "%d%d ", &n, &m );
for ( i = 1; i <= n; ++i ) {
for ( j = 1; j <= m; ++j ) {
T[i][j] = fgetc( fin );
if ( T[i][j] == 'I' ) {
lI = i;
cI = j;
} else if ( T[i][j] == 'O' ) {
lO = i;
cO = j;
}
}
fgetc( fin );
}
for ( i = 0; i <= n + 1; ++i ) {
T[i][m + 1] = T[i][0] = -1;
}
for ( j = 0; j <= m + 1; ++j ) {
T[n + 1][j] = T[0][j] = -1;
}
lee();
for ( i = 1; i <= n; ++i ) {
for ( j = 1; j <= m; ++j ) {
viz[i][j] = 0;
}
}
leeMax( lI, cI, lO, cO );
fprintf( fout, "%d", mind[lO][cO] );
fclose( fin );
fclose( fout );
return 0;
}