Pagini recente » Cod sursa (job #711305) | Cod sursa (job #1775510) | Cod sursa (job #854465) | Cod sursa (job #1152525) | Cod sursa (job #138080)
Cod sursa(job #138080)
#include <stdio.h>
#define DIM 1001
int a[DIM][DIM],x;
int d[DIM][DIM];
int n,m,i,j,t,dst,x1,y1,x2,y2,pr,ul,mij,min;
char v[DIM][DIM];
int c[2][DIM*DIM];
int di[4]={0,1,0,-1};
int dj[4]={1,0,-1,0};
int parc(int dist) {
int i,j,p,u,k,ic,jc,iv,jv;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
v[i][j]=0;
p=1;
u=1;
c[0][p]=x1;
c[1][p]=y1;
v[x1][y1]=1;
while (p<=u) {
ic=c[0][p];
jc=c[1][p];
for (k=0;k<=3;k++) {
iv = ic+di[k];
jv = jc+dj[k];
if ((iv>=1)&&(iv<=n)&&(jv>=1)&&(jv<=m)&&(d[iv][jv]>=dist)&&(v[iv][jv]==0)&&a[iv][jv]!='*') {
u++;
if ((iv==x2)&&(jv==y2))
return 1;
c[0][u]=iv;
c[1][u]=jv;
v[iv][jv]=1;
}
}
p++;
}
return 0;
}
int main(){
FILE *f = fopen("barbar.in","r");
fscanf(f,"%d %d",&n, &m);
i=1;j=1;
for (t=1;t<=n*m;){
fscanf(f,"%c",&x);
if ((x!='D')&&(x!='.')&&(x!='I')&&(x!='O')&&(x!='*'))
continue;
t++;
a[i][j]=x;
if (x=='I') {
x1=i;y1=j;
} else
if (x=='O') {
x2=i;y2=j;
}
if (j<m) j++;
else {
i++;
j=1;
}
}
fclose(f);
for (i=0;i<=n+1;i++)
for (j=0;j<=m+1;j++)
d[i][j]=DIM;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++) {
if (a[i][j]=='D'){
d[i][j]=0;
continue;
}
min = DIM;
for (t=j-1;t>0;t--)
if ((a[i][t]=='*')||(a[i][t]=='D'))
break;
if ((a[i][t]=='D')&&(j-t<min))
min=j-t;
for (t=j+1;t<=m;t++)
if ((a[i][t]=='*')||(a[i][t]=='D'))
break;
if ((a[i][t]=='D')&&(t-j<min))
min=t-j;
for (t=i-1;t>0;t--)
if ((a[t][j]=='*')||(a[t][j]=='D'))
break;
if ((a[t][j]=='D')&&(i-t<min))
min=i-t;
for (t=i+1;t<=n;t++)
if ((a[t][j]=='*')||(a[t][j]=='D'))
break;
if ((a[t][j]=='D')&&(t-i<min))
min=t-i;
d[i][j]=min;
/* if (a[i][j]=='D') {
d[i][j]=0;
t=j;dst=0;
while ((t-1>=1)&&((a[i][t-1]=='.')||(a[i][t-1]=='I')||(a[i][t-1]=='O'))) {
t--;
dst++;
if (d[i][t]>dst)
d[i][t]=dst;
}
t=j;dst=0;
while ((t+1<=m)&&((a[i][t+1]=='.')||(a[i][t+1]=='I')||(a[i][t+1]=='O'))) {
t++;
dst++;
if (d[i][t]>dst)
d[i][t]=dst;
}
t=i;dst=0;
while ((t-1>0)&&((a[t-1][j]=='.')||(a[t-1][j]=='I')||(a[t-1][j]=='O'))) {
t--;
dst++;
if (d[t][j]>dst)
d[t][j]=dst;
}
t=i;dst=0;
while ((t+1<=n)&&((a[t+1][j]=='.')||(a[t+1][j]=='I')||(a[t+1][j]=='O'))) {
t++;
dst++;
if (d[t][j]>dst)
d[t][j]=dst;
}
}*/
}
FILE *g = fopen("barbar.out","w");
int s;
s = parc(3);
if (parc(0)==0){
fprintf(g,"-1");
} else {
int minim=-1;
pr=0;
ul=DIM;
while (pr<=ul) {
mij = (pr+ul)/2;
if (s=parc(mij))
pr=mij+1;
else
ul=mij-1;
if ((s==1)&&(mij>minim))
minim=mij;
}
fprintf(g,"%d",minim);
}
fclose(g);
return 0;
}