Pagini recente » Cod sursa (job #2664097) | Cod sursa (job #650646) | Cod sursa (job #2167615) | Cod sursa (job #2226760) | Cod sursa (job #2336515)
#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[1001][1001],b[1001][1001],d[1001][1001];
int q[1000001][2],i,j,n,m,sol,pi,pj,ui,uj,mid,st,dr,u,p;
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;
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;
}
}
}
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){
mid=(st+dr)/2;
if(coada(pi,pj,mid)==1){
sol=mid;
st=mid+1;
}
else
dr=mid-1;
}
g<<sol;
return 0;
}