Cod sursa(job #371576)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 5 decembrie 2009 20:41:15
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include<stdio.h>
#define mod 3999988
int i,j,n,m,a[1100][1100],b[1100][1100],k,ii,ij,fi,fj,max=-1,viz[2000000],val,ok;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};

struct nod
{ 
	int x,y;
}p[5000000];

char s[1100][1100];


void compara(int i,int j)
{ 
	for(int t=0;t<4;t++) { int i1=i+dx[t];
	                       int j1=j+dy[t];
                           if(i1<=n&&i1>0&&j1<=m&&j1>0) 
						   { if((b[i1][j1]==0||b[i1][j1]>b[i][j]+1)&&(s[i1][j1]!='D'))
						                                         { b[i1][j1]=b[i][j]+1;
						                                           p[++k].x=i1;
                                                                   p[k].y=j1;
																 }
						   }
	                     }
    
}

int ver(int i,int j)
{
	if(b[i][j]>=val&&s[i][j]!='*'&&s[i][j]!='D') 
	{ 
		viz[(i-1)*1001+j]=val;
		
 	if(i==fi&&j==fj&&val>max) { max=val;
	                            ok=1;
	                          }
    else for(int t=0;t<4;++t) { int i1=i+dx[t];
                                int j1=j+dy[t]; 
	                             if(i1<=n&&i1>0&&j1<=m&&j1>0) 
									if(viz[(i1-1)*1001+j1]!=val) ver(i1,j1);
	                          }
    }
return 0;	
}                                   									 
 	
	

int cautbin()
{ 
	int st=1,dr=1100,mij=0;
	
	while(st<=dr) { mij=(st+dr)/2;
	                val=mij;
	                ok=0;
					ver(ii,ij);
	                if(ok) st=mij+1;
					else dr=mij-1;
	              }
    return 0;
}

int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for(i=1;i<=n;i++)
	{ scanf("%s",s[i]+1);
	  for(j=1;j<=m;j++) { if(s[i][j]=='*') b[i][j]=-1;
                          else if(s[i][j]=='D') { p[++k].x=i;
						                          p[k].y=j;
						                        }   
                          else if(s[i][j]=='I') { ii=i;
                                                  ij=j;
						                        }
						  else if(s[i][j]=='O') { fi=i;
						                          fj=j;
						                        }
	                    }		
    }	  
 	for(i=1;i<=k;i++) { 
		                 compara(p[i].x,p[i].y);
                      }
	
	
	cautbin();

	printf("%d\n",max);
	
    fclose(stdin);
    fclose(stdout);
    
    return 0;
}