Cod sursa(job #13664)

Utilizator bilygates2005Liviu Cristian Mirea-Ghiban bilygates2005 Data 7 februarie 2007 12:32:50
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<stdio.h>
int b[1000][1000];
int z[1000][1000];
 char a[1000][1000];
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;
}