Cod sursa(job #911181)

Utilizator iarbaCrestez Paul iarba Data 11 martie 2013 13:22:00
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
using namespace std;
int max[1002][1002],x,y,a[1002][1002],dist,sfx,sfy,stx,sty,n,m,i,j,drx[1000000],dry[1000000],d,maxpar[1002][1002];
char c;
int min(int p1,int p2)
{
	if(p1<p2){return p1;}
	else{return p2;}
}
void fill(int dist)
{
	if((maxpar[x][y]==0)&&(a[x][y]>=0)){
		maxpar[x][y]=min(max[x][y],dist);
		dist=maxpar[x][y];
		++x;fill(dist);x-=2;fill(dist);++x;
		++y;fill(dist);y-=2;fill(dist);++y;
										  }
	if((maxpar[x][y]<dist)&&(a[x][y]>=0)&&(max[x][y]>=dist)){
		maxpar[x][y]=dist;
		++x;fill(dist);x-=2;fill(dist);++x;
		++y;fill(dist);y-=2;fill(dist);++y;
										  }
}
void filldr()
{
	if(((max[x][y]>dist)||(max[x][y]==0))/*&&(a[x][y]!=-1)*/){
				max[x][y]=dist;
				dist++;
				++x;filldr();x-=2;filldr();++x;
				++y;filldr();y-=2;filldr();++y;
				dist--;
														  }
}
int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%ld%ld",&n,&m);
	for(i=1;i<=n;i++){scanf("\n");for(j=1;j<=m;j++){
					scanf("%c",&c);
					if(c=='.'){a[i][j]=0;}
					if(c=='*'){a[i][j]=-1;}
					if(c=='I'){a[i][j]=0;stx=i;sty=j;}
					if(c=='O'){
						a[i][j]=0;sfx=i;sfy=j;}
					if(c=='D'){a[i][j]=0;drx[++d]=i;dry[d]=j;}
									   }}
	for(i=0;i<=n+1;i++){a[i][0]=-1;a[i][m+1]=-1;}
	for(j=0;j<=m+1;j++){a[0][j]=-1;a[n+1][j]=-1;}
	for(i=1;i<=d;i++){x=drx[i];y=dry[i];dist=1;filldr();}
//	for(i=1;i<=d;i++){x=drx[i];y=dry[i];a[x][y]=-1;}
	dist=max[stx][sty];x=stx;y=sty;fill(dist);
	printf("%ld",maxpar[sfx][sfy]-1);
return 0;
}