Cod sursa(job #130292)

Utilizator a7893Nae Mihai a7893 Data 31 ianuarie 2008 19:33:02
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<stdio.h>
#define N 1002
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
int r,c,b[N][N],p,u,d[N][N];
char a[N][N];
struct vec{
	int x,y;
}coada[4*N*N],pi,pf;
void read()
{
	int i,j;
	char ch;
	scanf("%d%d\n",&r,&c);
	for(i=1;i<=r;i++)
	{
		for(j=1;j<=c;j++)
		{
			scanf("%c",&a[i][j]);
			b[i][j]=N*N;
			if(a[i][j]=='D')
			{
				coada[u++]=(vec){i,j};
				b[i][j]=0;
			}
			if(a[i][j]=='I')
				pi=(vec){i,j};
			if(a[i][j]=='O')
				pf=(vec){i,j};
		}
		scanf("%c",&ch);
	}
	for(i=0;i<=r+1;i++)
		a[i][0]=a[r+1][0]='*';
	for(j=0;j<=c+1;j++)
		a[0][j]=a[0][c+1]='*';
}
void afis_a()
{
	int i,j;
	for(i=1;i<=r;i++)
	{
		for(j=1;j<=c;j++)
			printf("%c",a[i][j]);
		printf("\n");
	}
}
void afis(int b[N][N])
{
	int i,j;
	for(i=1;i<=r;i++)
	{
		for(j=1;j<=c;j++)
			printf("%d ",b[i][j]);
		printf("\n");
	}
}	
void create_b()
{
	int x1,y1,x2,y2,i;
	for(;p<u;p++)
	{
		x1=coada[p].x;
		y1=coada[p].y;
		for(i=0;i<4;i++)
		{
			x2=x1+dx[i];
			y2=y1+dy[i];
			if(b[x2][y2]==N*N)
			{
				b[x2][y2]=b[x1][y1]+1;
				coada[u++]=(vec){x2,y2};
			}
		}
	}
}
inline int min(int a,int b)
{
	return a<b?a:b;
}
void solve()
{
	int x1,y1,x2,y2,i;
	d[pi.x][pi.y]=b[pi.x][pi.y];
	u=p=0;
	coada[u++]=(vec){pi.x,pi.y};
	for(;p<u;p++)
	{
		x1=coada[p].x;
		y1=coada[p].y;
		for(i=0;i<4;i++)
		{
			x2=x1+dx[i];
			y2=y1+dy[i];
			if(min(d[x1][y1],b[x2][y2])>d[x2][y2]&&a[x2][y2]!='*'&&a[x2][y2]!='D')
			{
				d[x2][y2]=min(d[x1][y1],b[x2][y2]);
				//pred[x2][y2]=(i+2)%4;
				coada[u++]=(vec){x2,y2};
			}
		}
	}
}
/*void drum(int x,int y)
{
	if(x!=pi.x||y!=pi.y)
		drum(x+dx[pred[x][y]],y+dy[pred[x][y]]);
	printf("(%d,%d)->",x,y);
}*/
int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	read();
	//afis();
	create_b();
	solve();
	//afis(b);
	//afis(d);
	//drum(pf.x,pf.y);
	printf("%d\n",d[pf.x][pf.y]==0?-1:d[pf.x][pf.y]);
	return 0;
}