Pagini recente » Cod sursa (job #2196497) | Cod sursa (job #106245) | Cod sursa (job #62311) | Cod sursa (job #90278) | Cod sursa (job #8824)
Cod sursa(job #8824)
#include<stdio.h>
long r,c,h[1010][1010],ok[1010][1010],si,sj,fi,fj;
long d[1000100],p,q,s;
void READ()
{
long i,j;
char x;
FILE *f;
f=fopen("barbar.in","r");
fscanf(f,"%ld %ld",&r,&c);
q=0;
for(i=1;i<=r;i++)
{ for(j=1;j<=c;j++)
{ fscanf(f,"%c",&x);
while(x=='\n') fscanf(f,"%c",&x);
if(x=='.') h[i][j]=1;
else if(x=='D'){ h[i][j]=-1; ok[i][j]=1; d[++q]=1001*i+j; }
else if(x=='I'){ h[i][j]=1; si=i; sj=j; }
else if(x=='O') { h[i][j]=1; fi=i; fj=j; }
else { h[i][j]=2; ok[i][j]=-1; }
}
}
fclose(f);
}
void BUILD()
{ long x,y,i,j;
p=1;
while(p<=q)
{
x=d[p]/1001;
y=d[p]%1001;
if(x>1) if(h[x-1][y]%2!=0 && h[x-1][y]>0 ) { ok[x-1][y]=ok[x][y]+1; d[++q]=(x-1)*1001+y; h[x-1][y]*=-1;}
if(x<r) if(h[x+1][y]%2!=0 && h[x+1][y]>0) { ok[x+1][y]=ok[x][y]+1; d[++q]=(x+1)*1001+y; h[x+1][y]*=-1;}
if(y>1) if(h[x][y-1]%2!=0 && h[x][y-1]>0) { ok[x][y-1]=ok[x][y]+1; d[++q]=x*1001+y-1; h[x][y-1]*=-1;}
if(y<c) if(h[x][y+1]%2!=0 && h[x][y+1]>0) { ok[x][y+1]=ok[x][y]+1; d[++q]=x*1001+y+1; h[x][y+1]*=-1;}
p++;
}
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
h[i][j]=0;
}
int ver(long k)
{ long x,y,p,q;
q=1;p=1;
d[1]=1001*si+sj;
while(p<=q)
{
x=d[p]/1001;
y=d[p]%1001;
if(x==fi && y==fj) return 1;
if(x>1 && ok[x-1][y]>=k && h[x-1][y]!=k)
{
h[x-1][y]=k;
d[++q]=d[p]-1001;
}
if(x<r && ok[x+1][y]>=k && h[x+1][y]!=k)
{
h[x+1][y]=k;
d[++q]=d[p]+1001;
}
if(y>1 && ok[x][y-1]>=k && h[x][y-1]!=k)
{
h[x][y-1]=k;
d[++q]=d[p]-1;
}
if(y<c && ok[x][y+1]>=k && h[x][y+1]!=k)
{
h[x][y+1]=k;
d[++q]=d[p]+1;
}
p++;
}
return 0;
}
void SOLVE()
{ long step;
for(step=1;step<ok[si][sj];step<<=1);
for(s=0;step;step>>=1)
if(s+step<=ok[si][sj] && ver(s+step)) s+=step;
}
void PRINT()
{ long i,j;
FILE *g;
g=fopen("barbar.out","w");
/*
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
fprintf(g,"%d ",ok[i][j]);
fprintf(g,"\n");
}*/
if(s>1)
fprintf(g,"%ld\n",s-1);
else fprintf(g,"-1");
fclose(g);
}
int main()
{
READ();
BUILD();
SOLVE();
PRINT();
return 0;
}