Pagini recente » Cod sursa (job #933668) | Cod sursa (job #2621543) | Cod sursa (job #30376) | Cod sursa (job #1524371) | Cod sursa (job #1845354)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#define N 2001
using namespace std;
struct ps
{
int l;
int c;
};
int i, j, n, m, p, u, nmx, D[N][N];
ps pi, pf, v, C[N * N];
int dl[] ={-1, 0, 1, 0}, dc[] = {0, 1, 0, -1};
bool ok, o[N][N];
char c;
void mx(ps pi, int r)
{
if(pi.l == pf.l && pi.c == pf.c) ok = 1;
o[pi.l][pi.c] = 1;
for(int k = 0; k < 4; k++)
{
v.l = pi.l + dl[k];
v.c = pi.c + dc[k];
if(!o[v.l][v.c] && D[v.l][v.c] >= r)
mx(v, r);
}
}
int main()
{
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d%d\n", &n, &m);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
scanf("%c", &c);
if(c == '*')
D[i][j] = -1;
else if(c == 'D')
{
u++;
C[u].l = i;
C[u].c = j;
D[i][j] = 1;
}
else
if(c == 'I')
{
pi.l = i;
pi.c = j;
}
else
if(c == 'O')
{
pf.l = i;
pf.c = j;
}
}
scanf("\n");
}
for(i = 1; i <= m; i++)
D[0][i] = D[n + 1][i] = -1;
for(i = 1; i <= n; i++)
D[i][0] = D[i][m + 1] = -1;
while(++p <= u)
for(int k = 0; k < 4; k++)
{
v.l = C[p].l + dl[k];
v.c = C[p].c + dc[k];
if(!D[v.l][v.c])
{
D[v.l][v.c] = D[C[p].l][C[p].c] + 1;
C[++u] = v;
}
}
int l = 1, r = n*n, mid;
{
while(l <= r)
{
mid = (l + r) / 2;
if(D[pi.l][pi.c] < mid)
r = mid - 1;
else
{
ok = 0;
memset(o, 0, sizeof(o));
mx(pi, mid);
if(ok)
{
l = mid + 1;
nmx = mid;
}
else r = mid - 1;
}
}
}
printf("%d\n", nmx - 1);
return 0;
}