Pagini recente » Cod sursa (job #2268552) | Cod sursa (job #238004) | Cod sursa (job #1278890) | Cod sursa (job #1089403) | Cod sursa (job #2076717)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
char c;
int xs,ys,xf,yf,n,m,a[1002][1002],b[1002][1002],cx[1000001],cy[1000001];
int pr,ul,s,d,mij;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void LEE()
{ pr=1;int i,xc,yc,xv,yv;
while(pr<=ul)
{ xc=cx[pr];
yc=cy[pr];
for(i=0;i<=3;i++)
{xv=xc+dx[i];
yv=yc+dy[i];
if(xv>=1&&xv<=n&&yv>=1&&yv<=m)
if(a[xv][yv]==0)
{ if(a[xc][yc]==-2) {a[xv][yv]=1;ul++;cx[ul]=xv;cy[ul]=yv;}
else {a[xv][yv]=a[xc][yc]+1;ul++;cx[ul]=xv;cy[ul]=yv;}
}
}
pr++;
}
}
int viz[1001][1001];
int le(int val)
{ pr=ul=1;int j,i,xc,yc,xv,yv;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
viz[i][j]=0;
cx[pr]=xs;
cy[pr]=ys;
viz[xs][ys]=1;
while(pr<=ul)
{ xc=cx[pr];
yc=cy[pr];
for(i=0;i<=3;i++)
{xv=xc+dx[i];
yv=yc+dy[i];
if(xv>=1&&xv<=n&&yv>=1&&yv<=m)
if((a[xv][yv]>=val||a[xv][yv]==-4)&&(a[xv][yv]>0||a[xv][yv]==-4)&&viz[xv][yv]==0)
{ if(a[xv][yv]==-4) return 1;
else {viz[xv][yv]=1;ul++;cx[ul]=xv;cy[ul]=yv;}
}
}
pr++;
}
return 0;
}
int main()
{ fin>>n>>m;fin.get();
int i,j;
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
{ fin>>c;
if(c=='.') a[i][j]=0;
else if(c=='*') a[i][j]=-1;
else if(c=='D') {a[i][j]=-2;ul++;cx[ul]=i;cy[ul]=j;}
else if(c=='I') {a[i][j]=-3;xs=i;ys=j;}
else if(c=='O') {a[i][j]=-4;xf=i;yf=j;}
}
fin.get();
}
LEE();
/* for(i=1;i<=n;i++)
{for(j=1;j<=m;j++)
fout<<a[i][j]<<" ";
fout<<"\n";}*/
s=1;d=n+m;
while(s<=d)
{ mij=s+(d-s)/2;
if(le(mij)==1) s=mij+1;
else d=mij-1;
}
if((s-1)!=0) fout<<s-1;
else fout<<-1;
return 0;
}