Pagini recente » Cod sursa (job #1828102) | Cod sursa (job #2516633) | Cod sursa (job #1326954) | Cod sursa (job #2306690) | Cod sursa (job #2307509)
#include <bits/stdc++.h>
using namespace std;
int modul(int x,int y)
{
if(x<y)return y-x;
return x-y;
}
char s[1005][1005];
int viz[1005][1005];
struct dr
{
int x,y;
};
dr k[100005];
int dist[1005][1005];
int m1[1005][1005],m,n,cnt;
void reint(int sl[1005][1005])
{
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
sl[i][j]=0;
}
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
bool ok(dr st,dr fi,int oc)
{
if(oc<dist[st.x][st.y])return 0;
if(oc<dist[fi.x][fi.y])return 0;
m1[st.x][st.y]=1;
queue<dr>q;
int ver=0;
q.push(st);
while(!q.empty())
{
st=q.front();
q.pop();
if(ver==1)continue;
for(int i=0;i<4;i++)
{
dr fg;
fg.x=st.x+dx[i];
fg.y=st.y+dy[i];
if(m1[fg.x][fg.y])continue;
if(dist[fg.x][fg.y]>oc)continue;
if(viz[fg.x][fg.y])continue;
m1[fg.x][fg.y]=1;
q.push(fg);
if(fg.x=fi.x&&fg.y==fi.y)return 1;
}
}
return 0;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int i,j;
scanf("%d%d\n",&m,&n);
for(i=1;i<=m;i++)
{
fgets(s[i]+1,1005,stdin);
s[i][n+1]=NULL;
}
dr start,stop;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
dist[i][j]=1000000;
if(s[i][j]=='D')
{
viz[i][j]=2;
k[++cnt].x=i;k[cnt].y=j;
continue;
}
if(s[i][j]=='*')
{
viz[i][j]=1;
continue;
}
if(s[i][j]=='I')
{
start.x=i;
start.y=j;
continue;
}
if(s[i][j]=='O')
{
stop.x=i;
stop.y=j;
continue;
}
}
}
for(i=1;i<=cnt;i++)
{
for(j=1;j<=m;j++)
{
for(int h=1;h<=n;h++)
dist[j][h]=min(dist[j][h],modul(j,k[i].x)+modul(h,k[i].y));
}
}
for(i=1;i<=m+1;i++)
viz[i][0]=viz[i][n+1]=1;
for(j=1;j<=n+1;j++)
viz[0][j]=viz[m+1][j]=1;
int st=0,dr=m+n;
while(st<=dr)
{
int med=(st+dr)/2;
reint(m1);
bool l=ok(start,stop,med);
if(l==1)dr=med-1;
else
st=med+1;
}
printf("%d\n",st-1);
return 0;
}