Pagini recente » Cod sursa (job #2323797) | Cod sursa (job #2934555) | Cod sursa (job #2290196) | Cod sursa (job #2795658) | Cod sursa (job #569021)
Cod sursa(job #569021)
#include <cstdio>
#include <cassert>
#include <queue>
#include <algorithm>
#define Nmax 1005
#define InFile "barbar.in"
#define OutFile "barbar.out"
using namespace std;
int n, m;
int C[Nmax][Nmax], M[Nmax][Nmax];
struct Punct {int x, y;} st, fsh;
queue <Punct> Q;
void read();
void boarding();
void Dragoons();
int solve();
void reinit();
int Lee (int);
int main()
{
assert (freopen (InFile, "r", stdin));
assert (freopen (OutFile, "w", stdout));
read();
boarding();
Dragoons();
printf ("%d\n", solve());
return 0;
}
void read()
{
int i, j;
char c;
Punct el;
scanf ("%d %d\n", &n, &m);
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
scanf ("%c", &c);
if (c=='*') M[i][j]=-1, C[i][j]=-1;
if (c=='D') el.x=i, el.y=j, Q.push (el), M[i][j]=1;
if (c=='I') st.x=i, st.y=j;
if (c=='O') fsh.x=i, fsh.y=j;
}
scanf ("%*c");
}
}
void boarding ()
{
int i;
for (i=0; i<=m+1; i++)
M[0][i]=M[n+1][i]=-1, C[0][i]=C[n+1][i]=-1;
for (i=0; i<=n+1; i++)
M[i][0]=M[i][m+1]=-1, C[i][0]=C[i][m+1]=-1;
}
void Dragoons()
{
int i, j;
Punct x, y;
int dl[]={-1, 0, 1, 0}, dc[]={0, 1, 0, -1};
while (!Q.empty())
{
x=Q.front(); Q.pop();
for (i=0; i<4; i++)
{
y.x=x.x+dl[i]; y.y=x.y+dc[i];
if (!M[y.x][y.y])
{
M[y.x][y.y]=M[x.x][x.y]+1;
Q.push (y);
}
}
}
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
if (M[i][j]>0)
M[i][j]--;
}
int solve()
{
int mij, sg=0, dr=min (M[st.x][st.y], M[fsh.x][fsh.y]), p=-1;
while (sg<=dr)
{
mij=sg+(dr-sg)/2;
if (Lee (mij))
{
p=mij;
sg=mij+1;
}
else
dr=mij-1;
}
return p;
}
int Lee(int val)
{
int i;
Punct x, y;
int dl[]={-1, 0, 1, 0}, dc[]={0, 1, 0, -1};
reinit();
Q.push (st);
while (!Q.empty())
{
x=Q.front (); Q.pop();
if (x.x==fsh.x && x.y==fsh.y) return 1;
for (i=0; i<4; i++)
{
y.x=x.x+dl[i]; y.y=x.y+dc[i];
if (!C[y.x][y.y] && M[y.x][y.y]>=val)
{
C[y.x][y.y]=1;
Q.push (y);
}
}
}
return 0;
}
void reinit()
{
int i, j;
while (!Q.empty()) Q.pop();
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
if (C[i][j]>0)
C[i][j]=0;
}