Pagini recente » Cod sursa (job #1195117) | Cod sursa (job #2146737) | Cod sursa (job #3122947) | Cod sursa (job #1284267) | Cod sursa (job #1391925)
#include <cstdio>
int m,n;
struct str
{
int x;
int y;
}qu[1000101];
int ps=0,i1,i2,s1,s2;
int a[1005][1005],ver[1005][1005],mij,vmax;
void bfs(int pos)
{
if(pos==ps) return;
if(qu[pos].y<m&&a[qu[pos].x][qu[pos].y+1]>a[qu[pos].x][qu[pos].y]+1)
{
a[qu[pos].x][qu[pos].y+1]=a[qu[pos].x][qu[pos].y]+1;
qu[ps].x=qu[pos].x;
qu[ps].y=qu[pos].y+1;
ps++;
}
if(qu[pos].y>1&&a[qu[pos].x][qu[pos].y-1]>a[qu[pos].x][qu[pos].y]+1)
{
a[qu[pos].x][qu[pos].y-1]=a[qu[pos].x][qu[pos].y]+1;
qu[ps].x=qu[pos].x;
qu[ps].y=qu[pos].y-1;
ps++;
}
if(qu[pos].x<n&&a[qu[pos].x+1][qu[pos].y]>a[qu[pos].x][qu[pos].y]+1)
{
a[qu[pos].x+1][qu[pos].y]=a[qu[pos].x][qu[pos].y]+1;
qu[ps].x=qu[pos].x+1;
qu[ps].y=qu[pos].y;
ps++;
}
if(qu[pos].x>1&&a[qu[pos].x-1][qu[pos].y]>a[qu[pos].x][qu[pos].y]+1)
{
a[qu[pos].x-1][qu[pos].y]=a[qu[pos].x][qu[pos].y]+1;
qu[ps].x=qu[pos].x-1;
qu[ps].y=qu[pos].y;
ps++;
}
bfs(pos+1);
}
void dfs(int p1,int p2)
{
ver[p1][p2]=mij;
if(p1==s1&&p2==s2) return;
if(p1>1&&(a[p1-1][p2]>=mij||a[p1-1][p2]==-5)&&ver[p1-1][p2]!=mij)
{
dfs(p1-1,p2);
if(ver[s1][s2]==mij) return;
}
if(p1<n&&(a[p1+1][p2]>=mij||a[p1+1][p2]==-5)&&ver[p1+1][p2]!=mij)
{
dfs(p1+1,p2);
if(ver[s1][s2]==mij) return;
}
if(p2>1&&(a[p1][p2-1]>=mij||a[p1][p2-1]==-5)&&ver[p1][p2-1]!=mij)
{
dfs(p1,p2-1);
if(ver[s1][s2]==mij) return;
}
if(p2<m&&(a[p1][p2+1]>=mij||a[p1][p2+1]==-5)&&ver[p1][p2+1]!=mij)
{
dfs(p1,p2+1);
if(ver[s1][s2]==mij) return;
}
}
int main()
{
freopen ("barbar.in","r",stdin);
freopen ("barbar.out","w",stdout);
scanf("%d%d",&n,&m);
char ch;
for(int i=1;i<=n;i++)
{
scanf("%c",&ch);
for(int j=1;j<=m;j++)
{
scanf("%c",&ch);
if(ch=='*') a[i][j]=-1;
else if(ch=='I')
{
a[i][j]=100000000;
i1=i;
i2=j;
}
else if(ch=='O')
{
a[i][j]=100000000;
s1=i;
s2=j;
}
else if(ch=='.') a[i][j]=100000000;
else if(ch=='D')
{
a[i][j]=0;
qu[ps].x=i;
qu[ps].y=j;
ps++;
}
}
}
bfs(0);
int mint=a[i1][i2];
if(mint>a[s1][s2]) mint=a[s1][s2];
a[i1][i2]=-10;
a[s1][s2]=-5;
int s=0,e=1000000,af=-1;
while(s<=e)
{
mij=(s+e)/2;
ver[i1][i2]=mij;
dfs(i1,i2);
if(ver[s1][s2]!=mij) e=mij-1;
else
{
af=mij;
s=mij+1;
}
}
if(af>mint) af=mint;
printf("%d\n",af);
}