Pagini recente » Cod sursa (job #1201475) | Cod sursa (job #1724466) | Cod sursa (job #2884974) | Cod sursa (job #3173399) | Cod sursa (job #43990)
Cod sursa(job #43990)
#include <stdio.h>
#define MAX 1002
int a[MAX][MAX], C[MAX*MAX], viz[MAX*(MAX+1)+MAX+1], n, m, Sf=0, Inc=0, pi, pj, fi, fj;
int di[]={-1, 1, 0, 0}, dj[]={0, 0, -1, 1};
void read()
{
int i, j;
char ch;
FILE *f=fopen("barbar.in", "r");
fscanf (f, "%d %d", &n, &m);
for (i=1; i<=n; i++)
{fscanf (f, "\n");
for (j=1; j<=m; j++)
{
fscanf (f, "%c", &ch);
if (ch=='.') a[i][j]=-1;
else if (ch=='*') a[i][j]=-2;
else if (ch=='D')
{
a[i][j]=0;
C[Sf++]=i*(m+1)+j;
}
else if (ch=='I') {a[i][j]=-1; pi=i; pj=j; }
else if (ch=='O') {a[i][j]=-1; fi=i; fj=j; }
}
}
for (i=0; i<=m+1; i++)
a[0][i]=a[n+1][i]=-2;
for (i=0; i<=n+1; i++)
a[i][0]=a[i][n+1]=-2;
}
void lee()
{
int i, j, ii, jj, k;
while (Inc < Sf)
{
i = C[Inc]/(m+1); j = C[Inc]%(m+1); Inc++;
for (k=0; k<4; k++)
{
ii=i+di[k]; jj=j+dj[k];
if (a[ii][jj]==-1)
{
a[ii][jj] = a[i][j]+1;
C[Sf++] = ii*(m+1)+jj;
}
}
}
}
int bfs (int x)
{
int i, j, ii, jj, k;
for (i=1; i<=n*(m+1)+m+1; i++) viz[i]=0;
if (a[pi][pj] < x) return 0;
Inc=0; Sf=1;
C[0]=pi*(m+1)+pj;
viz[C[0]]=1;
while (Inc < Sf)
{
i = C[Inc]/(m+1); j = C[Inc]%(m+1); Inc++;
if (i == fi && j == fj) return 1;
for (k=0; k<4; k++)
{
ii=i+di[k]; jj=j+dj[k];
if (a[ii][jj] >= x && !viz[ii*(m+1)+jj])
C[Sf++] = ii*(m+1)+jj, viz[C[Sf-1]]=1;
}
}
return 0;
}
int main()
{
int st=0, dr, mij, ok=0;
read();
lee ();
dr=m*n;
while (dr-st>1)
{
mij = (dr+st)>>1;
if ( bfs(mij) ) {st=mij; ok=1; }
else dr=mij;
}
if (!ok && bfs(0)) {ok=1; st=0; }
FILE *g=fopen("barbar.out", "w");
if (ok) fprintf (g, "%d\n", st);
else fprintf (g, "-1\n");
fclose(g);
return 0;
}