Pagini recente » Cod sursa (job #2907293) | Cod sursa (job #318073) | Cod sursa (job #2868950) | Cod sursa (job #147023) | Cod sursa (job #2336527)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1},a[1005][1005],b[1005][1005],d[1005][1005];
int q[1000011][2],i,j,n,m,sol,pi,pj,ui,uj,mid,st,dr,u,p,mini;
char ch;
int coada(int x,int y,int v){
memset(b,0,sizeof(b));
int p=0,u=0;
q[p][0]=x;
q[p][1]=y;
b[x][y]=1;
if(d[x][y]<v)
return 0;
while(p<=u){
int l=q[p][0];
int c=q[p][1];
p++;
for(int k=1;k<=4;k++){
int ln=l+dx[k];
int cn=c+dy[k];
if(ln>=1&&ln<=n&&cn>=1&&cn<=n)
if(a[ln][cn]==0&&b[ln][cn]==0&&d[ln][cn]>=v){
b[ln][cn]=1;
q[++u][0]=ln;
q[u][1]=cn;
mini=min(mini,d[ln][cn]);
}
}
}
return b[ui][uj];
}
int main()
{ f>>n>>m;
u=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
f>>ch;
if(ch=='*')
a[i][j]=1;
else if(ch=='D'){
a[i][j]=1;
q[++u][0]=i;
q[u][1]=j;
b[i][j]=1;
}
else if(ch=='I'){
pi=i;
pj=j;
}
else if(ch=='O'){
ui=i;
uj=j;
}
}
p=1;
while(p<=u){
int l=q[p][0];
int c=q[p][1];
p++;
for(int k=1;k<=4;k++){
int ln=l+dx[k];
int cn=c+dy[k];
if(ln>=1&&ln<=n&&cn>=1&&cn<=m)
if(a[ln][cn]==0&&b[ln][cn]==0){
d[ln][cn]=d[l][c]+1;
b[ln][cn]=1;
q[++u][0]=ln;
q[u][1]=cn;
}
}
}
st=1;dr=n*m;
sol=-1;
while(st<=dr){
mini=n*m;
mid=(st+dr)/2;
if(coada(pi,pj,mid)==1){
sol=min(mini,mid);
st=mid+1;
}
else
dr=mid-1;
}
g<<sol;
return 0;
}