Pagini recente » Cod sursa (job #938076) | Cod sursa (job #1681077) | Cod sursa (job #34836) | Cod sursa (job #1166982) | Cod sursa (job #1094369)
#include<string.h>
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
char ch;
int dx[]={0,-1,0,1,0},mx,q,st,dr,mij,v[1001][1001],inf=2000000,dy[]={0,0,1,0,-1},cod[2][1000001],f1,f2,s1,s2,xx,yy,p,u,n,m,i,j,a[1002][1002],b[1001][1001],x,y;
int coada2(int mn){
p=1;
u=1;
memset(v,0,sizeof(v));
cod[0][1]=s1;
cod[1][1]=s2;
v[s1][s2]=1;
while(p<=u&&(cod[0][p]!=f1||cod[1][p]!=f2)){
x=cod[0][p];
y=cod[1][p];
for(i=1;i<=4;i++){
xx=x+dx[i];
yy=y+dy[i];
if(a[xx][yy]==1&&b[xx][yy]>=mn&&v[xx][yy]==0){
u++;
v[xx][yy]=1;
cod[0][u]=xx;
cod[1][u]=yy;
}
}
p++;}
if(p>u)
return -1;
return 1;
}
void coada1(){
int p=1;
while(p<=u){
x=cod[0][p];
y=cod[1][p];
for(i=1;i<=4;i++){
xx=x+dx[i];
yy=y+dy[i];
if(a[xx][yy]==1&&b[xx][yy]>b[x][y]+1){
u++;
cod[0][u]=xx;
cod[1][u]=yy;
b[xx][yy]=b[x][y]+1;}
}
p++;}
}
int main()
{
x=y=1;
in>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
in>>ch;
if(ch=='.'){
a[i][j]=1;
b[i][j]=inf;
continue;}
if(ch=='*'){
a[i][j]=-1;
b[i][j]=inf;
continue;
}
if(ch=='D'){
u++;
a[i][j]=1;
cod[0][u]=i;
cod[1][u]=j;
b[i][j]=0;
continue;}
if(ch=='I'){
a[i][j]=1;
b[i][j]=inf;
s1=i;s2=j;
continue;}
if(ch=='O'){
a[i][j]=1;
b[i][j]=inf;
f1=i;f2=j;
continue;}}
for(i=0;i<=n+1;i++){
a[i][0]=-1;
a[i][m+1]=-1;}
for(i=0;i<=m+1;i++){
a[0][i]=-1;
a[n+1][i]=-1;}
coada1();
st=0;dr=n*m+1;
mx=-1;
while(st<=dr){
mij=(st+dr)/2;
q=coada2(mij);
if(q==1){
mx=mij;
st=mij+1;}
else
dr=mij-1;}
out<<mx;
return 0;
}