Pagini recente » Cod sursa (job #2591499) | Cod sursa (job #394762) | Cod sursa (job #2752123) | Cod sursa (job #820059) | Cod sursa (job #14224)
Cod sursa(job #14224)
#include<stdio.h>
int b[100][100];
int z[100][100];
char a[100][100];
int w,h;
struct point{int x; int y;}
in,out,stiva[500],stiva2[500],dir[4];
int stc,stc2;
int isok(int x, int y)
{
if(x<1 || y<1 || x>w || y>h)return 0;
if(a[x][y]=='*')return 0;
return 1;
}
void filldragon(int x, int y)
{
int i,j,e,f,g;
stiva[0].x=x;
stiva[0].y=y;
b[x][y]=1;
stc=1;
while(stc>0)
{
stc2=0;
for(i=0;i<stc;i++)
{
for(j=0;j<4;j++)
{
e=stiva[i].x+dir[j].x;
f=stiva[i].y+dir[j].y;
g=b[stiva[i].x][stiva[i].y];
if(isok(e,f) && (b[e][f]==0 || b[e][f]>g))
{
b[e][f]=g+1;
stiva2[stc2].x=e;
stiva2[stc2].y=f;
stc2++;
}
}
}
for(i=0;i<stc2;i++)
{stiva[i].x=stiva2[i].x;
stiva[i].y=stiva2[i].y;}
stc=stc2;
}
}
void fillall(int x, int y)
{
int i,j,e,f,g;
stiva[0].x=x;
stiva[0].y=y;
z[x][y]=b[x][y];
stc=1;
while(stc>0)
{
stc2=0;
for(i=0;i<stc;i++)
{
for(j=0;j<4;j++)
{
e=stiva[i].x+dir[j].x;
f=stiva[i].y+dir[j].y;
g=z[stiva[i].x][stiva[i].y];
if(isok(e,f) && (z[e][f]==0 || z[e][f]<g))
{
z[e][f]=g;
if(b[e][f]<z[e][f]){z[e][f]=b[e][f];}
stiva2[stc2].x=e;
stiva2[stc2].y=f;
stc2++;
}
}
}
for(i=0;i<stc2;i++)
{stiva[i].x=stiva2[i].x;
stiva[i].y=stiva2[i].y;}
stc=stc2;
}
}
int main()
{
int i,j;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&h,&w);
for(i=1;i<=w;i++)
{
for(j=1;j<=h;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='I'){in.x=i;in.y=j;}
if(a[i][j]=='O'){out.x=i;out.y=j;}
}
scanf("%c",&a[0][0]);
}
fclose(stdin);
dir[0].x=-1;dir[0].y= 0;
dir[1].x= 0;dir[1].y=-1;
dir[2].x= 1;dir[2].y= 0;
dir[3].x= 0;dir[3].y= 1;
for(i=1;i<=w;i++)
{
for(j=1;j<=h;j++)
{
if(a[i][j]=='D'){filldragon(i,j);}
}
}
fillall(in.x,in.y);
/* for(i=1;i<=w;i++)
{
printf(".");
for(j=1;j<=h;j++)
{
printf("%d",z[i][j]);
}
printf("\n");
}*/
printf("%d",z[out.x][out.y]-1);
fclose(stdout);
return 0;
}