Pagini recente » Cod sursa (job #426331) | Cod sursa (job #1640376) | Cod sursa (job #2112480) | Profil Marinescu_Danyel | Cod sursa (job #2289940)
#include<stdio.h>
#define mod 3999988
int i, j, n, m, a[1100][1100], b[1100][1100], k, ii, ij, fi, fj, max = 0, viz[2000000], val, ok;
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
struct nod
{
int x, y;
}p[5000000];
char s[1100][1100];
void compara(int i, int j)
{
for (int t = 0; t < 4; t++) {
int i1 = i + dx[t];
int j1 = j + dy[t];
if (i1 <= n && i1 > 0 && j1 <= m && j1 > 0)
{
if ((b[i1][j1] == 0 || b[i1][j1] > b[i][j] + 1) && (s[i1][j1] != 'D'))
{
b[i1][j1] = b[i][j] + 1;
p[++k].x = i1;
p[k].y = j1;
}
}
}
}
int ver(int i, int j)
{
if (b[i][j] >= val && s[i][j] != '*'&&s[i][j] != 'D')
{
viz[(i - 1) * 1001 + j] = val;
if (i == fi && j == fj && val > max) {
max = val;
ok = 1;
}
else for (int t = 0; t < 4; ++t) {
int i1 = i + dx[t];
int j1 = j + dy[t];
if (i1 <= n && i1 > 0 && j1 <= m && j1 > 0)
if (viz[(i1 - 1) * 1001 + j1] != val) ver(i1, j1);
}
}
return 0;
}
int cautbin()
{
int st = 1, dr = 1100, mij = 0;
while (st <= dr) {
mij = (st + dr) / 2;
val = mij;
ok = 0;
ver(ii, ij);
if (ok) st = mij + 1;
else dr = mij - 1;
}
return 0;
}
int main()
{
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d %d", &n, &m);
for (i = 1; i <= n; i++)
{
scanf("%s", s[i] + 1);
for (j = 1; j <= m; j++) {
if (s[i][j] == '*') b[i][j] = -1;
else if (s[i][j] == 'D') {
p[++k].x = i;
p[k].y = j;
}
else if (s[i][j] == 'I') {
ii = i;
ij = j;
}
else if (s[i][j] == 'O') {
fi = i;
fj = j;
}
}
}
for (i = 1; i <= k; i++) {
compara(p[i].x, p[i].y);
}
cautbin();
printf("%d\n", max);
fclose(stdin);
fclose(stdout);
return 0;
}