Pagini recente » Cod sursa (job #929639) | Cod sursa (job #33517) | Cod sursa (job #491668) | Cod sursa (job #1838488) | Cod sursa (job #1300946)
#include <cstdio>
#include <queue>
#define infinit 10000000
#define nmax 1005
using namespace std;
FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");
int n,m,l1,c1,l2,c2;
int dl[4],dc[4];
int v[nmax][nmax];
int k[nmax][nmax],x[nmax][nmax];
int l[nmax*nmax],c[nmax*nmax],p=1,u,sol;
char s[nmax+5];
int main(){
int i,j,st,dr,mid;
fscanf(f,"%d %d",&n,&m);
for (i=1;i<=n;i++) for (j=1;j<=m;j++) k[i][j]=infinit;
for (i=1;i<=n;i++) {
fscanf(f,"%s\n",&s);
for (j=0;j<m;j++)if (s[j]=='*') v[i][j+1]=-1;
else if (s[j]=='D') {v[i][j+1]=-1;
u++;
k[i][j+1]=0;
l[u]=i;c[u]=j+1;}
else if (s[j]=='I') {l1=i;c1=j+1;}
else if (s[j]=='O') {l2=i;c2=j+1;}
}
dl[0]=1;
dl[1]=-1;
dc[2]=1;
dc[3]=-1;
while (p<=u) {
for (j=0;j<4;j++) if (k[l[p]][c[p]]+1<k[l[p]+dl[j]][c[p]+dc[j]]){
k[l[p]+dl[j]][c[p]+dc[j]]=k[l[p]][c[p]]+1;
u++;
l[u]=l[p]+dl[j];
c[u]=c[p]+dc[j];}
p++;
}
st=0;dr=nmax*nmax;
while (st<=dr){for (i=1;i<=n;i++) for (j=1;j<=m;j++) x[i][j]=1;
x[l1][c1]=0;
mid=(st+dr)>>1;
p=1;u=1;
l[1]=l1;c[1]=c1;
while (p<=u){
for (j=0;j<4;j++) if (k[l[p]+dl[j]][c[p]+dc[j]]>=mid&&x[l[p]+dl[j]][c[p]+dc[j]]!=0){
x[l[p]+dl[j]][c[p]+dc[j]]=0;
u++;
l[u]=l[p]+dl[j];
c[u]=c[p]+dc[j];}
p++;}
if (x[l2][c2]==0) {
sol=mid;
st=mid+1;
}
else dr=mid-1;
}
fprintf(g,"%d\n",sol);
return 0;
}