Pagini recente » Cod sursa (job #1975162) | Cod sursa (job #2554701) | Cod sursa (job #1600142) | Cod sursa (job #1001613) | Cod sursa (job #2651120)
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
ifstream f ( "barbar.in" );
ofstream g ( "barbar.out" );
const int N = 1005;
queue < pair < int, int > > q;
int dx[] = { 0, -1, 0, 1, 0 }, dy[] = { 0, 0, 1, 0, -1 }, a[N][N], b[N][N], d[N][N];
int i, j, n, m, sol, pi, pj, ui, uj, mid, st, dr, u, p, mini;
char ch;
bool coada( int v ){
memset ( b, 0, sizeof ( b ) );
q.push ( { pi, pj } );
b[pi][pj] = 1;
if ( d[pi][pj] < v )
return 0;
while ( !q.empty ( ) ){
int l = q.front ( ).first;
int c = q.front ( ).second;
q.pop ( );
for ( int k = 1; k <= 4; k++ ){
int ln = l + dx[k];
int cn = c + dy[k];
if ( ln >= 1 && ln <= n && cn >= 1 && cn <= n )
if( a[ln][cn] == 0 && b[ln][cn] == 0 && d[ln][cn] >= v ){
b[ln][cn] = 1;
q.push ( { ln, cn } );
mini = min ( mini, d[ln][cn] );
}
}
}
return b[ui][uj];
}
int main()
{ f >> n >> m;
for ( i = 1; i <= n; i++ )
for ( j = 1; j <= m; j++ ){
f >> ch;
if ( ch == '*' )
a[i][j] = 1;
else if ( ch == 'D' ){
a[i][j] = 1;
q.push ( { i, j } );
b[i][j] = 1;
}
else if ( ch == 'I' ){
pi = i;
pj = j;
}
else if ( ch == 'O' ){
ui = i;
uj = j;
}
}
while ( !q.empty ( ) ){
int l = q.front ( ).first;
int c = q.front ( ).second;
q.pop ( );
for(int k = 1; k <= 4; k++ ){
int ln = l + dx[k];
int cn = c + dy[k];
if ( ln >= 1 && ln <= n && cn >= 1 && cn <= m )
if ( a[ln][cn] == 0 && b[ln][cn] == 0 ){
d[ln][cn] = d[l][c] + 1;
b[ln][cn] = 1;
q.push ( { ln, cn } );
}
}
}
st = 0; dr = n * m;
sol = -1;
while ( st <= dr ){
mini = n * m;
mid = ( st + dr ) / 2;
if ( coada ( mid ) == 1 ){
sol = min ( mini, mid );
st = mid + 1;
}
else
dr = mid - 1;
}
if ( sol == 0 )
sol = -1;
g << sol;
return 0;
}