Cod sursa(job #14222)

Utilizator bilygates2005Liviu Cristian Mirea-Ghiban bilygates2005 Data 8 februarie 2007 14:52:58
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#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",&w,&h);
 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;
}