Pagini recente » Cod sursa (job #1875412) | Cod sursa (job #1484384) | Cod sursa (job #674115) | Cod sursa (job #1595703) | Cod sursa (job #457148)
Cod sursa(job #457148)
#include <stdio.h>
#define DIM 1100
#define INF 2*DIM
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int v[DIM][DIM];
char a[DIM][DIM];
int s[DIM][DIM];
int b[DIM][DIM];
int cd[3][DIM*DIM*2];
int r,c,ok,x1,y1,x2,y2,k,p,u,m,ic,jc,iv,jv,x;
int incerc(int x){
int i,j,p,u;
ok=0;
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
v[i][j]=0;
if (b[x1][y1]<x)
return 0;
p=1;u=1;
cd[1][p]=x1;cd[2][p]=y1;
v[x1][y1]=1;
while ((p<=u)&&(!ok)) {
for (k=0;k<=3;k++) {
iv=cd[1][p]+dx[k];
jv=cd[2][p]+dy[k];
if ((iv>=1)&&(iv<=r)&&(jv>=1)&&(jv<=c)&&(v[iv][jv]==0)&&(b[iv][jv]>=x)) {
u++;
cd[1][u]=iv;
cd[2][u]=jv;
v[iv][jv]=1;
if ((iv==x2)&&(jv==y2)) {
ok=1;
break;
}
}
}
p++;
}
return ok;
}
int main(){
int i,j;
FILE *f = fopen("barbar.in","r");
fscanf(f,"%d %d",&r,&c);
for (i=1;i<=r;i++) {
fscanf(f,"\n");
for (j=1;j<=c;j++) {
fscanf(f,"%c",&a[i][j]);
if (a[i][j]!='*')
b[i][j]=INF;
else
b[i][j]=-1;
if (a[i][j]=='I') {
x1=i;y1=j;
} else if (a[i][j]=='O'){
x2=i;y2=j;
}
}
}
fclose(f);
p=1;
u=0;
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
if (a[i][j]=='D') {
u++;
cd[1][u]=i;
cd[2][u]=j;
b[i][j]=0;
s[i][j]=u;
}
while (p<=u) {
ic=cd[1][p];
jc=cd[2][p];
for (i=0;i<=3;i++) {
iv=ic+dx[i];
jv=jc+dy[i];
if ((a[iv][jv]!='*')&&(iv>=1)&&(iv<=r)&&(jv>=1)&&(jv<=c)&&(b[iv][jv]>b[ic][jc]+1)) {
if (s[iv][jv]==0) {
u++;
cd[1][u]=iv;
cd[2][u]=jv;
s[iv][jv]=u;
}
b[iv][jv]=b[ic][jc]+1;
}
}
s[cd[1][p]][cd[2][p]]=0;
p++;
}
FILE *g = fopen("barbar.out","w");
x=0;
if (!incerc(0)){
fprintf(g,"-1");
} else {
int max=r+c-2;
p=0; u=max;
while (p<=u) {
m = (p+u)/2;
x=m;
if (incerc(m))
p=m+1;
else
u=m-1;
}
fprintf(g,"%d",u);
}
fclose(g);
return 0;
}