Pagini recente » Cod sursa (job #460222) | Cod sursa (job #2560575) | Cod sursa (job #2372726) | Cod sursa (job #1432462) | Cod sursa (job #530786)
Cod sursa(job #530786)
#include <stdio.h>
#include <string.h>
#define mm 100000
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&&a[l][ccc]==mm){
a[l][ccc]=a[q[0][p]][q[1][p]]+1;
u++;
q[0][u]=l;
q[1][u]=ccc;
}
}
p++;
}
}
int coada1(int m) {
int p=1,u=1,l,ccc;
q[0][1]=r1;
q[1][1]=c1;
if(a[r1][c1]<m)
return 0;
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]=mm;
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,m,ok;
while(cp<=cu){
m=(cp+cu)/2;
ok=coada1(m);
if(ok==1){
tb=m;
cp=m+1;
}
else
cu=m-1;
}
fprintf(g,"%d",tb);
return 0;
}