Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Diferente pentru onis-2016/solutii-runda-1 intre reviziile 11 si 29 | Cod sursa (job #2055089) | Cod sursa (job #778214)
Cod sursa(job #778214)
# include <fstream>
# include <cstring>
# include <algorithm>
# include <vector>
# include <queue>
# define dim 1005
# define inf 999999999
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m;
int a[ dim ][ dim ], b[ dim ][ dim ];
int inx, iny;
int fx, fy;
int sol = -1;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
struct coada
{
int X, Y;
};
queue < coada > q, q2;
void citire()
{
int i, j;
char var;
coada u;
f >> n >> m;
f.get();
for ( i = 1 ; i <= n ; ++i )
{
for ( j = 1 ; j <= m ; ++j )
{
f >> var;
if ( var == '.')
a[ i ][ j ] = b[ i ][ j ] = inf;
else
if ( var == 'I')
inx = i, iny = j, a[ i ][ j ] = 0, b[ i ][ j ] = inf;
else
if ( var == 'D')
{
u.X = i;
u.Y = j;
q.push( u );
a[ i ][ j ] = - 1;
}
else
if ( var == '*' )
a[ i ][ j ] = b[ i ][ j ] = -1;
else
if ( var == 'O' )
fx = i, fy = j, a[ i ][ j ] = inf, b[ i ][ j ] = inf;
}
}
}
void afisare()
{
int i, j;
for ( i = 1 ; i <= n ; i++ )
{
for ( j = 1 ; j <= m ; j++ )
g << a[ i ][ j ] << " ";
g << "\n";
}
}
void lee1()
{
int x, y, xx, yy;
int i;
coada var, var2;
while( !q.empty() )
{
var = q.front();
x = var.X;
y = var.Y;
for ( i = 0 ; i <= 3 ; ++i )
{
xx = x + dx[ i ];
yy = y + dy[ i ];
if ( b[ xx ][ yy ] > b[ x ][ y ] + 1 && b[ x ][ y ] != -1 && xx >= 1 && yy >= 1 && xx <= n && yy <=m )
{
b[ xx ][ yy ] = b[ x ][ y ] + 1;
var2.X = xx;
var2.Y = yy;
q.push( var2 );
}
}
q.pop();
}
}
void lee2( int val )
{
int x, y, xx, yy;
int i;
int ok = 1;
coada var, var2;
while( !q.empty() )
{
var = q.front();
x = var.X;
y = var.Y;
for ( i = 0 ; i <= 3 && ok == 1 ; ++i )
{
xx = x + dx[ i ];
yy = y + dy[ i ];
if ( xx == fx && yy == fy )
ok = 0;
if ( a[ xx ][ yy ] > a[ x ][ y ] + 1 && a[ x ][ y ] != -1 && b[ xx ][ yy ] >= val && xx >= 1 && yy >= 1 && xx <= n && yy <= m )
{
a[ xx ][ yy ] = a[ x ][ y ] + 1;
var2.X = xx;
var2.Y = yy;
q.push( var2 );
q2.push( var2 );
}
}
q.pop();
if ( ok == 0 )
{
while( !q.empty() )
q.pop();
}
}
}
void init()
{
coada var;
while ( !q2.empty() )
{
var = q2.front();
a[ var.X ][ var.Y ] = inf;
q2.pop();
}
//a[ fx ][ fy ] == inf;
}
inline bool verif( int x )
{
coada var;
int ok;
var.X = inx;
var.Y = iny;
q.push( var );
lee2( x );
//afisare();
// g << "\n";
if ( a[ fx ][ fy ] != inf )
ok = 1;
else
ok = 0;
init();
return ok;
}
void cauta()
{
int mid, st, dr;
st = 1, dr = max( n, m );
while( st <= dr )
{
mid = ( st + dr ) / 2;
if ( verif( mid ) == true )
st = mid + 1, sol = mid;
else
dr = mid - 1;
}
if ( sol != -1 )
sol = ( st + dr ) / 2;
g << sol;
}
void rezolva()
{
lee1();
//afisare();
cauta();
}
int main()
{
citire();
rezolva();
//afisare();
return 0;
}