Cod sursa(job #369940)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 29 noiembrie 2009 20:27:51
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include<stdio.h>
#define mod 3999988
int i,j,n,m,a[1100][1100],b[1100][1100],k,ii,ij,fi,fj,max;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};

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

char s[1100][1100];

int doo(int x)
{ 
	while(x>mod) x-=mod;
	return x;
}	

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[doo(++k)].x=i1;
                                                                   p[doo(k)].y=j1;
																 }
						   }
	                     }
    
}

void compara1(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(a[i1][j1]>=0)  
									 if(a[i][j]>a[i1][j1]){ if(a[i][j]<b[i1][j1])
							                              { a[i1][j1]=a[i][j];
                                                            p[doo(++k)].x=i1;
                                                            p[doo(k)].y=j1;
                                                          }
                        								 else { a[i1][j1]=b[i1][j1];
                                                                p[doo(++k)].x=i1;
                                                                p[doo(k)].y=j1;
								                     		  }}					  
	                     }
}	
														  
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]=='*') a[i][j]=-1,b[i][j]=-1;
                          else if(s[i][j]=='D') { a[i][j]=-1;
	                                              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++) { int q=doo(i); 
		                 compara(p[q].x,p[q].y);
                      }
    
	k=0;
	a[ii][ij]=b[ii][ij];
    p[++k].x=ii;
    p[k].y=ij;
    
    for(i=1;i<=k;i++) { int q=doo(i);
		                 compara1(p[q].x,p[q].y);
	                  }
	
    if(!a[fi][fj]) printf("-1\n");
	else printf("%d\n",a[fi][fj]);
    
    fclose(stdin);
    fclose(stdout);
    
    return 0;
}