Pagini recente » Cod sursa (job #753803) | Cod sursa (job #582228) | Cod sursa (job #2768830) | Cod sursa (job #2917389) | Cod sursa (job #66311)
Cod sursa(job #66311)
#include <stdio.h>
#define maxsz 1024
#define inf 1000000000
FILE *in = fopen("barbar.in","r"), *out = fopen("barbar.out","w");
int n, m;
char a[maxsz][maxsz];
int b[maxsz][maxsz];
int startx, starty;
int endx, endy;
struct coada
{
short x, y;
};
coada C[maxsz*maxsz];
int p, u = -1;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
void read()
{
fscanf(in, "%d %d", &n, &m);
for ( int i = 0; i <= n; ++i )
b[0][i] = b[n][i] = -1;
for ( int i = 0; i <= m; ++i )
b[i][0] = b[i][m] = -1;
for ( int i = 1; i <= n; ++i )
for ( int j = 1; j <= m; ++j )
{
fscanf(in, "%1s", &a[i][j]);
b[i][j] = inf;
if ( a[i][j] == 'I' )
startx = i, starty = j;
else if ( a[i][j] == 'O' )
endx = i, endy = j;
else if ( a[i][j] == 'D' )
++u, C[u].x = i, C[u].y = j, b[i][j] = 0;
else if ( a[i][j] == '*' )
b[i][j] = -1;
else
b[i][j] = inf;
}
}
void init()
{
while ( p <= u )
{
for ( int i = 0; i < 4; ++i )
{
int X = C[p].x + dx[i];
int Y = C[p].y + dy[i];
int D = b[C[p].x][C[p].y] + 1;
if ( D < b[X][Y] )
{
b[X][Y] = D;
++u;
C[u].x = X;
C[u].y = Y;
}
}
++p;
}
}
int check(int dist)
{
p = 0;
u = 0;
C[p].x = startx;
C[p].y = starty;
if ( b[startx][starty] < dist )
return 0;
char viz[maxsz][maxsz] = {{0}};
while ( p <= u )
{
for ( int i = 0; i < 4; ++i )
{
int X = C[p].x + dx[i];
int Y = C[p].y + dy[i];
if ( X == endx && Y == endy )
if ( b[endx][endy] >= dist )
return 1;
else
return 0;
if ( X > 0 && Y > 0 && X <= n && Y <= m )
if ( b[X][Y] >= dist && !viz[X][Y] )
{
++u;
C[u].x = X;
C[u].y = Y;
viz[X][Y] = 1;
}
}
++p;
}
return 0;
}
int main()
{
read();
init();
// for ( int i = 1; i <= n; ++i )
// {
// for ( int j = 1; j <= m; ++j )
// printf("%d ", b[i][j]);
// printf("\n");
// }
// printf("\n==========================\n\nRezultat:\n");
int lo = 0;
int hi = n*m+2;
int sol = -1;
// for ( int i = 0; i < mx; ++i )
// {
// if ( check(i) == 1 )
// sol = i;
// else
// break;
// }
while ( lo <= hi )
{
int m = (lo + hi) >> 1;
if ( check(m) == 1 )
lo = m + 1, sol = m;
else
hi = m - 1;
}
fprintf(out, "%d\n", sol);
return 0;
}