Pagini recente » Monitorul de evaluare | Cod sursa (job #1874372) | Cod sursa (job #587431) | Cod sursa (job #960071) | Cod sursa (job #2629056)
#include <fstream>
#include <deque>
#include <bitset>
#define INF 1000100
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
struct potae {
int lin, col, val;
};
struct p1 {
int l,c;
};
deque < potae > d;
deque <p1> v;
int n, i, j, m, xs, ys, xf, yf, ic, jc, iv, jv, dist, pas, st, dr, mid;
int a[1100][1100], distmin[1100][1100];
char ch;
int di[] = { -1, 1, 0, 0 };
int dj[] = { 0, 0, 1, -1 };
bitset < 1100 > fr[1100];
bool solve ( int val ){
if ( distmin[xs][ys] < val )
return 0;
v.clear(); a[xs][ys] = val;
v.push_back({xs, ys});
for ( int i = 1; i <= n; i++ )
fr[i].reset();
while ( !v.empty() ){
int ic = v.front().l;
int jc = v.front().c;
if ( ic == xf && jc == yf )
return 1;
v.pop_front();
for ( int pas = 0; pas < 4; pas++ ){
int iv = ic + di[pas];
int jv = jc + dj[pas];
if ( iv && jv && iv <= n && jv <= m &&
distmin[iv][jv] >= val && !fr[iv][jv] && a[iv][jv] != -1 ){
v.push_back( { iv, jv } );
fr[iv][jv] = 1;
}
}
}
return 0;
}
int main()
{
f>>n>>m;
for ( i=1; i <= n; i++ )
for ( j=1; j <= m; j++ ){
f>>ch;
distmin[i][j] = INF;
if ( ch == 'I' )
xs = i, ys = j;
if ( ch == 'D' ){
d.push_back({i, j, 0});
distmin[i][j] = 0;
a[i][j] = -1;
}
if ( ch == 'O' )
xf = i, yf = j;
if ( ch == '*' )
a[i][j] = -1, distmin[i][j] = -1;
}
while ( !d.empty() ){
ic = d.front().lin;
jc = d.front().col;
dist = d.front().val;
d.pop_front();
for ( pas = 0; pas < 4; pas++ ){
iv = ic+di[pas];
jv = jc+dj[pas];
if ( iv && jv && iv <= n && jv <= m && distmin[iv][jv] == INF && a[iv][jv] != -1 ){
distmin[iv][jv] = dist+1;
d.push_back( { iv, jv, dist+1 } );
}
}
}
int maxx = -1;
for ( i=1; i <= n; i++ )
for ( j=1; j <= m; j++ )
maxx = max ( maxx, distmin[i][j] );
st = 1; dr = maxx; int sol = -1;
while ( st <= dr ){
mid = st + ( (dr-st)>>1 );
if ( solve ( mid ) ){
st = mid+1;
sol = mid;
}
else dr = mid-1;
}
g<<sol;
return 0;
}