Pagini recente » Cod sursa (job #1328234) | Cod sursa (job #3161334) | Cod sursa (job #1256466) | Cod sursa (job #336022) | Cod sursa (job #2307541)
#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;
}
queue<dr>dragon;
dr start,stop;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
dist[i][j]=0;
if(s[i][j]=='D')
{
viz[i][j]=2;
k[++cnt].x=i;k[cnt].y=j;
dragon.push(k[cnt]);
dist[i][j]=1;
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;
}
}
}
while(!dragon.empty())
{
dr dr1=dragon.front();
dragon.pop();
for(i=0;i<4;i++)
{
dr dr2;
dr2.x=dr1.x+dx[i];
dr2.y=dr1.y+dy[i];
if(dr2.x==0)continue;
if(dr2.y==0)continue;
if(dr2.x==(m+1))continue;
if(dr2.y==(n+1))continue;
if(dist[dr2.x][dr2.y]==0)
{
dist[dr2.x][dr2.y]=dist[dr1.x][dr1.y]+1;
dragon.push(dr2);
continue;
}
if((dist[dr1.x][dr1.y]+1)<dist[dr2.x][dr2.y]){
dist[dr2.x][dr2.y]=dist[dr1.x][dr1.y]+1;
dragon.push(dr2);
continue;
}
}
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)dist[i][j]--;
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;
int rez=-1;
while(st<=dr)
{
int med=(st+dr)/2;
reint(m1);
bool l=ok(start,stop,med);
if(l==1)st=med+1,rez=med;
else
dr=med-1;
}
if(st==(m+n+1))st=0;
printf("%d\n",rez);
return 0;
}