Pagini recente » Cod sursa (job #2923140) | Cod sursa (job #590563) | Cod sursa (job #2595653) | Cod sursa (job #419244) | Cod sursa (job #119552)
Cod sursa(job #119552)
#include <fstream>
#define NMax 1005
#define ND 4
#define ZID -1
#define INF 32000
int in, sf;
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0,-1 };
struct point{ int x, y; } C[NMax*NMax], aux;
int n, m;
int a[NMax][NMax];
int b[NMax][NMax];
point start, stop;
std::ifstream f( "barbar.in" );
std::ofstream g( "barbar.out" );
void citire();
void rez();
int lee( int mij );
int main()
{
citire();
rez();
return 0;
}
int lee( int mij )
{
int i, j;
in = sf = 0;
C[in] = start;
for (i=0; i<=n+1; i++)
for (j=0; j<=m+1; j++)
if ( a[i][j] != ZID )
b[i][j] = 0;
else
b[i][j] = 1;
b[start.x][start.y] = 1;
while ( in <= sf )
{
aux = C[in++];
if ( aux.x == stop.x && aux.y == stop.y && a[aux.x][aux.y] >= mij )
return 1;
for (i=0; i<ND; i++)
if ( a[aux.x+dx[i]][aux.y+dy[i]] >= mij &&
a[aux.x+dx[i]][aux.y+dy[i]] != ZID &&
b[aux.x+dx[i]][aux.y+dy[i]] == 0 )
{
sf++;
C[sf].x = aux.x+dx[i];
C[sf].y = aux.y+dy[i];
b[aux.x+dx[i]][aux.y+dy[i]] = 1;
}
}
return 0;
}
void rez()
{
int i, st, dr, mij, ok, min = -1;
while ( in <= sf )
{
aux = C[in++];
for (i=0; i<ND; i++)
if ( a[aux.x+dx[i]][aux.y+dy[i]] > 1 + a[aux.x][aux.y] && a[aux.x+dx[i]][aux.y+dy[i]] != ZID )
{
a[aux.x+dx[i]][aux.y+dy[i]] = 1 + a[aux.x][aux.y];
sf++;
C[sf].x = aux.x+dx[i];
C[sf].y = aux.y+dy[i];
}
}
st = 0; dr = 1000;
while ( st <= dr )
{
mij = (st+dr)/2;
ok = lee( mij );
if ( !ok )
{
dr = mij;
}
else
{
min = mij;
st = mij;
}
if ( st == dr-1 )
break;
}
g << min << '\n';
}
void citire()
{
int i, j;
char aux[NMax];
f >> n >> m ;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
a[i][j] = INF;
f.get();
for (i=1; i<=n; i++)
{
f.getline( aux, NMax, '\n' );
for (j=1; j<=m; j++)
switch ( aux[j-1] )
{
case 'I':
start.x = i; start.y = j;
break;
case 'O':
stop.x = i; stop.y = j;
break;
case 'D':
C[sf].x = i; C[sf].y = j;
a[i][j] = 0;
sf++;
break;
case '*':
a[i][j] = ZID;
break;
}
}
sf--;
for (i=0; i<=n+1; i++)
a[i][0] = a[i][m+1] = ZID;
for (j=0; j<=m+1; j++)
a[0][j] = a[n+1][j] = ZID;
}