Pagini recente » Cod sursa (job #2563712) | Cod sursa (job #520536) | Cod sursa (job #2316105) | Cod sursa (job #2213451) | Cod sursa (job #1026843)
#include <fstream>
#include <iostream>
#define nmax 1005
using namespace std;
ifstream fin ( "barbar.in" );
ofstream fout ( "barbar.out" );
int dist[1005][1005], care[1005][1005], X[1000005], Y[1000005];
int xi, yi, xf, yf, ic, sc, l, m, r, x, y, i, j, ok, dist_max = -1;
int N, M;
char c;
int dx[] = { 0, 1, 0, -1};
int dy[] = { 1, 0, -1, 0};
void citire()
{
fin>>N>>M;
for (i = 1; i <= N; i++)
for (j = 1; j <= M; j++)
{
fin>>c;
dist[i][j] = nmax;
if( c == '*' )
dist[i][j] = 0;
else
if( c == 'D' )
{
dist[i][j] = 0;
++sc;
X[sc] = i;
Y[sc] = j;
}
else
if( c == 'I' )
{
xi = i;
yi = j;
}
else
if( c == 'O' )
{
xf = i;
yf = j;
}
}
}
void distante()
{
for ( ic = 1; ic <= sc; ic++ )
for ( i = 0, x = X[ic], y = Y[ic]; i < 4; i++ )
if (dist[x + dx[i]][y + dy[i]] > dist[x][y]+1 && x+dx[i] >= 1 && x+dx[i] <= N && y+dy[i] >= 1 && y+dy[i] <= M)
{
dist[x + dx[i]][y + dy[i]] = dist[x][y] + 1;
sc++;
X[sc] = x + dx[i];
Y[sc] = y + dy[i];
}
}
int test( int m )
{
if (dist[xi][yi] < m || dist[xf][yf] < m)
return 0;
for ( ic = sc = 0, X[ic] = xi, Y[ic] = yi; ic <= sc && care[xf][yf] != m; ic++)
{
x = X[ic];
y = Y[ic];
for (i = 0; i < 4; ++i)
if (x+dx[i] >= 1 && x+dx[i] <= N && y+dy[i] >= 1 && y+dy[i] <= M && care[x + dx[i]][y + dy[i]] != m && dist[x+dx[i]][y+dy[i]] >= m)
{
sc++;
X[sc] = x+dx[i];
Y[sc] = y+dy[i];
care[x+dx[i]][y+dy[i]] = m;
}
}
if (care[xf][yf] == m)
return 1;
return 0;
}
void cautare(int st, int dr)
{
int m = (st + dr)/2;
if( st > dr )
return;
else
{
if( ! test (m) )
cautare(st, m-1);
else
{
dist_max = m;
cautare(m+1, dr);
}
}
}
int main()
{
citire();
distante();
int max = M;
if( N>M )
max=N;
cautare(1, max);
fout<<dist_max;
return 0;
}