Pagini recente » Cod sursa (job #1353672) | Cod sursa (job #1216157) | Cod sursa (job #2751599) | Cod sursa (job #84212) | Cod sursa (job #195415)
Cod sursa(job #195415)
#include <stdio.h>
#define DIM 1001
#define INF 1003
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int v[DIM][DIM];
int a[DIM][DIM];
int b[DIM][DIM];
int r,c,ok,x1,y1,x2,y2,k,p,u,m;
void caut(int i, int j, int x) {
v[i][j]=1;
int k,iv,jv;
if (ok) return;
if ((i==x2)&&(j==y2)) {
ok=1;
return;
}
for (k=0;k<=3;k++) {
iv = i+dx[k];
jv = j+dy[k];
if ((iv<1)||(iv>r)||(jv<1)||(jv>c))
continue;
if ((v[iv][jv]==0)&&(b[iv][jv]>=x)) {
// v[iv][jv]=1;
caut(iv,jv,x);
}
}
}
int incerc(int x){
int i,j;
ok=0;
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
v[i][j]=0;
caut(x1,y1,x);
return ok;
}
int main(){
FILE *f = fopen("barbar.in","r");
fscanf(f,"%d %d",&r,&c);
int i,j;
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);
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
if (a[i][j]=='D') {
a[i][j]=0;
k=1;
while ((i-k>=1)&&(a[i-k][j]=='.')) {
b[i-k][j]=b[i-k][j]<k?b[i-k][j]:k;
k++;
}
k=1;
while ((i+k<=r)&&(a[i+k][j]=='.')) {
b[i+k][j]=b[i+k][j]<k?b[i+k][j]:k;
k++;
}
k=1;
while ((j+k<=c)&&(a[i][j+k]=='.')) {
b[i][j+k]=b[i][j+k]<k?b[i][j+k]:k;
k++;
}
k=1;
while ((j-k>=1)&&(a[i][j-k]=='.')) {
b[i][j-k]=b[i][j-k]<k?b[i][j-k]:k;
k++;
}
}
FILE *g = fopen("barbar.out","w");
if (!incerc(0)){
fprintf(g,"-1");
} else {
p=0; u=INF;
while (p<=u) {
m = (p+u)/2;
if (incerc(m))
p=m+1;
else
u=m-1;
}
fprintf(g,"%d",u);
}
fclose(g);
printf("%d",incerc(3));
return 0;
}