Pagini recente » Cod sursa (job #2216064) | Cod sursa (job #2040632) | Cod sursa (job #3153896) | Cod sursa (job #1318043) | Cod sursa (job #530764)
Cod sursa(job #530764)
#include <stdio.h>
#include <string.h>
FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");
int viz[1001][1001],q[2][1000001],a[1001][1001],i,j,r,c,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0},u,p,r1,c1,r2,c2;
char cc;
int abs(int x) {
if(x<0)
return -x;
return x;
}
void coada() {
p=1;
int l,ccc;
while(p<=u) {
for(int i=0;i<=3;i++) {
l=q[0][p]+dx[i];
ccc=q[1][p]+dy[i];
if(a[l][ccc]!=-1)
if(a[l][ccc]>a[q[0][p]][q[1][p]]+1) {
a[l][ccc]=a[q[0][p]][q[1][p]]+1;
if(viz[l][ccc]==0) {
viz[l][ccc]=1;
u++;
q[0][u]=l;
q[1][u]=ccc;
}
}
}
viz[q[0][p]][q[1][p]]=0;p++;
}
}
int coada1(int m) {
int p=1,u=1,l,ccc;
q[0][1]=r1;
q[1][1]=c1;
memset(viz,0,sizeof(viz));
viz[r1][c1]=1;
while(p<=u) {
for(int i=0;i<=3;i++) {
l=q[0][p]+dx[i];
ccc=q[1][p]+dy[i];
if(a[l][ccc]!=-1&&a[l][ccc]>=m&&viz[l][ccc]==0){
viz[l][ccc]=1;
u++;
q[0][u]=l;
q[1][u]=ccc;
if(l==r2&&ccc==c2)
return 1;
}
}
p++;
}
return 0;
}
int main() {
fscanf(f,"%d%d\n",&r,&c);
u=0;
for(i=1;i<=r;i++) {
for(j=1;j<=c;j++) {
fscanf(f,"%c",&cc);
if(cc=='D'){
a[i][j]=0;
u++;
q[0][u]=i;
q[1][u]=j;
}
else
if(cc!='*')
a[i][j]=10000001;
else
a[i][j]=-1;
if(cc=='I') {
r1=i;
c1=j;
}
if(cc=='O') {
r2=i;
c2=j;
}
}
fscanf(f,"\n");
}
for(i=0;i<=c+1;i++)
a[0][i]=a[r+1][i]=-1;
for(i=0;i<=r+1;i++)
a[i][0]=a[i][c+1]=-1;
coada();
int cp=0;int tb=-1, cu=(r+c+abs(r-c))/2,m,ok;
while(cp<=cu){
m=(cp+cu)/2;
ok=coada1(m);
if(ok==1){
tb=m;
cp=m+1;
}
else
cu=m-1;
}
if(tb==-1){
fprintf(g,"-1");
return 0;
}
fprintf(g,"%d",tb);
return 0;
}