Pagini recente » Cod sursa (job #3293227) | Cod sursa (job #695376) | Cod sursa (job #3259882) | Cod sursa (job #3287995) | Cod sursa (job #13657)
Cod sursa(job #13657)
#include<stdio.h>
int b[100][100];
int z[100][100];
char a[100][100];
int r,c,gx,gy;
int dx[500],dy[500],dc=1,dx2[500],dy2[500],dc2;
int merge(int x, int y)
{
if(x>=0 && y>=0 && x<=r && y<=c && a[x][y]!='*')
{
return 1;
}
return 0;
}
int mark(int x, int y,int w)
{
if(x>=0 && y>=0 && x<=r && y<=c)
{
if(b[x][y]==-1 || b[x][y]>w)b[x][y]=w;
return 1;
}
return 0;
}
void filldragon(int x, int y)
{
int i,j,k,sw;
k=1;sw=0;
b[x][y]=0;
while(sw==0)
{
sw=1;
for(i=0;i<=k;i++)
{
if(mark(x+i,y+i-k,k)==1){sw=0;}
if(mark(x-i,y-i+k,k)==1){sw=0;}
if(mark(x+i-k,y-i,k)==1){sw=0;}
if(mark(x-i+k,y+i,k)==1){sw=0;}
}
k++;
}
}
int main()
{
int i,j;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&r,&c);
scanf("%c",&a[0][0]);
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{b[i][j]=-1;}}
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
z[i][j]=-1;
scanf("%c",&a[i][j]);
// b[i][j]=0;
if(a[i][j]=='D'){filldragon(i,j);}
if(a[i][j]=='I'){dx[0]=i;dy[0]=j;}
if(a[i][j]=='O'){gx=i;gy=j;}
}
scanf("%c",&a[0][0]);
}
fclose(stdin);
int dirx[4],diry[4];
dirx[0]=-1;diry[0]= 0;
dirx[1]= 0;diry[1]=-1;
dirx[2]= 1;diry[2]= 0;
dirx[3]= 0;diry[3]= 1;
int e,f;
z[dx[0]][dy[0]]=b[dx[0]][dy[0]];
z[gx][gy]=-1;
while(dc>0)
{
dc2=0;
for(i=0;i<dc;i++)
{
for(j=0;j<4;j++)
{
e=dx[i]+dirx[j];
f=dy[i]+diry[j];
if(merge(e,f))
{
if(z[e][f]==-1 || z[e][f]<z[dx[i]][dy[i]])
{
z[e][f]=z[dx[i]][dy[i]];
dx2[dc2]=e;dy2[dc2]=f;
dc2++;
}
if(b[e][f]<z[e][f])z[e][f]=b[e][f];
}
}
}
dc=dc2;
for(i=0;i<dc;i++)
{
dx[i]=dx2[i];
dy[i]=dy2[i];
}
}
/* for(i=1;i<=c;i++)
{
printf(".");
for(j=1;j<=r;j++)
{
printf("%d",b[i][j]);
b[i][j]=0;
}
printf("\n");
} */
printf("%d",z[gx][gy]);
fclose(stdout);
return 0;
}