Pagini recente » Cod sursa (job #1640270) | Cod sursa (job #2340729) | Cod sursa (job #577487) | Cod sursa (job #1523405) | Cod sursa (job #1087381)
#include <fstream>
#include <queue>
#include <string>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int inf= 1<<30;
const int dx[]= {0, 0, 1, -1};
const int dy[]= {1, -1, 0, 0};
const int nmax= 1000;
const int mmax= 1000;
int d[nmax+2][mmax+2];
struct str {
int x, y;
};
inline str mp( int x, int y ) {
str sol;
sol.x= x;
sol.y= y;
return sol;
}
queue <str> q;
void bfs( ) {
while ( !q.empty() ) {
int xb= q.front().x, yb= q.front().y;
q.pop();
for ( int i= 0; i<4; ++i ) {
int x= xb+dx[i], y= yb+dy[i];
if ( d[xb][yb]+1<d[x][y] ) {
q.push( mp( x, y ) );
d[x][y]= d[xb][yb]+1;
}
}
}
}
int check( int v, int x1, int y1, int x2, int y2 ) {
bool u[nmax+2][mmax+2];
for ( int i= 0; i<=nmax+1; ++i ) {
for ( int j= 0; j<=mmax+1; ++j ) {
u[i][j]= 0;
}
}
queue <str> q2;
q2.push( mp( x1, y1 ) );
while ( !q2.empty() ) {
int xb= q2.front().x, yb= q2.front().y;
q2.pop();
for ( int i= 0; i<4; ++i ) {
int x= xb+dx[i], y= yb+dy[i];
if ( d[x][y]>=v &&u[x][y]==0 ) {
u[x][y]= 1;
q2.push( mp( x, y ) );
}
}
}
return u[x2][y2];
}
int main( ) {
int n, m;
fin>>n>>m;
for ( int i= 0; i<=n+1; ++i ) {
d[i][0]= d[i][m+1]= -1;
}
for ( int j= 0; j<=m+1; ++j ) {
d[0][j]= d[n+1][j]= -1;
}
int x1= 0, y1= 0, x2= 0, y2= 0;
for ( int i= 1; i<=n; ++i ) {
string x;
fin>>x;
for ( int j= 1; j<=m; ++j ) {
if ( x[j-1]=='.' ) {
d[i][j]= inf;
} else if ( x[j-1]=='*' ) {
d[i][j]= -1;
} else if ( x[j-1]=='D' ) {
d[i][j]= 0;
q.push( mp( i, j ) );
} else if ( x[j-1]=='I' ) {
d[i][j]= inf;
x1= i, y1= j;
} else if ( x[j-1]=='O' ) {
d[i][j]= inf;
x2= i, y2= j;
}
}
}
bfs();
int n2, sol= 0, ri= d[x1][y1];
if ( d[x2][y2]<ri ) {
ri= d[x2][y2];
}
if ( ri==inf ) {
ri= 0;
}
for ( n2= 1; n2<=ri; n2*= 2 ) {
}
for ( int step= n2; step>0; step/= 2 ) {
if ( sol+step<=ri && check(sol+step, x1, y1, x2, y2) ) {
sol+= step;
}
}
fout<<sol<<"\n";
return 0;
}