Cod sursa(job #917587)

Utilizator iarbaCrestez Paul iarba Data 18 martie 2013 09:43:16
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <cstdio>
using namespace std;
int max[1002][1002],x,y,a[1002][1002],dist,sfx,sfy,stx,sty,n,m,i,j,d,maxpar[1002][1002],st,sf,stiv[1000000][3];
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;
                                          }
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%ld%ld",&n,&m);
	sf=0;st=1;
    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;stiv[++sf][0]=i;stiv[sf][1]=j;stiv[sf][2]=0;}
                                       }}
    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;}
	while(sf>=st){
		if(max[stiv[st][0]+1][stiv[st][1]]==0){
			max[stiv[st][0]+1][stiv[st][1]]=stiv[st][2]+1;
			stiv[sf+1][1]=stiv[st][1]+1;
			stiv[sf+1][2]=stiv[st][2];
			stiv[sf+1][3]=stiv[st][3]+1;
			sf++;
											  }
		if(max[stiv[st][0]-1][stiv[st][1]]==0){
			max[stiv[st][0]-1][stiv[st][1]]=stiv[st][2]+1;
			stiv[sf+1][1]=stiv[st][1]-1;
			stiv[sf+1][2]=stiv[st][2];
			stiv[sf+1][3]=stiv[st][3]+1;
			sf++;
											  }
		if(max[stiv[st][0]][stiv[st][1]+1]==0){
			max[stiv[st][0]][stiv[st][1]+1]=stiv[st][2]+1;
			stiv[sf+1][1]=stiv[st][1];
			stiv[sf+1][2]=stiv[st][2]+1;
			stiv[sf+1][3]=stiv[st][3]+1;
			sf++;
											  }
		if(max[stiv[st][0]][stiv[st][1]-1]==0){
			max[stiv[st][0]][stiv[st][1]-1]=stiv[st][2]+1;
			stiv[sf+1][1]=stiv[st][1];
			stiv[sf+1][2]=stiv[st][2]-1;
			stiv[sf+1][3]=stiv[st][3]+1;
			sf++;
											  }
				 }
    dist=max[stx][sty];x=stx;y=sty;fill(dist);
    printf("%ld",maxpar[sfx][sfy]-1);
return 0;
}