Pagini recente » Cod sursa (job #10122) | Cod sursa (job #1767116) | Cod sursa (job #723556) | Cod sursa (job #2188896) | Cod sursa (job #22517)
Cod sursa(job #22517)
//sursa buna de 90
#include <stdio.h>
#include <string.h>
#define NMAX 1111
int mat[NMAX][NMAX],viz[NMAX][NMAX];
int dl[4]={-1,0,1,0},dc[4]={0,1,0,-1};
struct punct { int x,y; };
punct c[NMAX*NMAX],p1,p2,p;
char ch,s[NMAX];
int n,m,i,j,k,s1,s2,bl,br,bm,ajuns;
void dfs(int val,int l1,int l2 )
{
int i;
if (l1==p2.x && l2==p2.y) ajuns=1;
viz[l1][l2]=1;
for (i=0;i<4;i++)
if (mat[l1+dl[i]][l2+dc[i]]>=val && viz[l1+dl[i]][l2+dc[i]]==0)
dfs(val,l1+dl[i],l2+dc[i]);
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d",&n,&m);
s1=-1;
for (i=0;i<=n+1;i++)
for (j=0;j<=m+1;j++)
mat[i][j]=-2;
for (i=1;i<=n;i++)
{
scanf("%s",s);
for (j=1;j<=m;j++)
{
mat[i][j]=-1;
if (s[j-1]=='*') mat[i][j]=-2;
if (s[j-1]=='D') { mat[i][j]=0; c[++s1].x=i; c[s1].y=j; }
if (s[j-1]=='I') { p1.x=i; p1.y=j; }
if (s[j-1]=='O') { p2.x=i; p2.y=j; }
}
}
s2=s1;
s1=0;
while (s1<=s2)
{
p=c[s1++];
for (i=0;i<4;i++)
if (mat[p.x+dl[i]][p.y+dc[i]]==-1)
{
mat[p.x+dl[i]][p.y+dc[i]]=mat[p.x][p.y]+1;
c[++s2].x=p.x+dl[i];
c[s2].y=p.y+dc[i];
}
}
bl=-1;
br=n*m*10;
while (br-bl>1)
{
bm=(bl+br)>>1;
ajuns=0;
memset(viz,0,sizeof(viz));
dfs(bm,p1.x,p1.y);
if (ajuns==1) bl=bm;
else br=bm;
}
if (bl>-1)printf("%d\n",bl);
else printf("-1\n");
fclose(stdin);
fclose(stdout);
return 0;
}