Pagini recente » Cod sursa (job #552452) | Cod sursa (job #1894420) | Cod sursa (job #1961720) | Cod sursa (job #1821614) | Cod sursa (job #1734964)
//Cine a facut sursa e BO$$
//Sursa by Ionut Anghelina
#include<bits/stdc++.h>
using namespace std;
deque<int> q1,q2;
int r,c,xi,yi,xf,yf,a[1005][1005],b[1005][1005],d[5][3],m[1005][1005],x,ls,ld,mid,y,sol;
char c1;
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&r,&c);
for(int i=1;i<=r;i++)
{
scanf("\n");
for(int j=1;j<=c;j++)
{
//m[i][j]=-1;
scanf("%c",&c1);
if (c1=='.')
{
b[i][j]=INT_MAX;
}
else
if (c1=='I')
{
xi=i;
yi=j;
b[i][j]=INT_MAX;
}
else
if (c1=='O')
{
xf=i;
yf=j;
b[i][j]=INT_MAX;
}
else
if (c1=='D')
{
a[i][j]=-1;
b[i][j]=0;
q1.push_front(i);
q2.push_front(j);
}
else
{
a[i][j]=-1;
b[i][j]=-1;
}
}
}
d[1][1]=-1;
d[1][2]=0;
d[2][1]=1;
d[2][2]=0;
d[3][1]=0;
d[3][2]=-1;
d[4][1]=0;
d[4][2]=1;
for(int i=0;i<=(c+1);i++)
{
a[0][i]=a[r+1][i]=-2;
}
for(int i=0;i<=(r+1);i++)
{
a[i][0]=a[i][c+1]=-2;
}
while (!q1.empty())
{
for(int i=1;i<=4;i++)
{
{
if (a[q1.front()+d[i][1]][q2.front()+d[i][2]]>=0)
{
if (b[q1.front()+d[i][1]][q2.front()+d[i][2]]>(b[q1.front()][q2.front()]+1))
{
b[q1.front()+d[i][1]][q2.front()+d[i][2]]=b[q1.front()][q2.front()]+1;
q1.push_back(q1.front()+d[i][1]);
q2.push_back(q2.front()+d[i][2]);
}
}
}
}
q1.pop_front();
q2.pop_front();
}
ls=0;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
ld=max(ld,b[i][j]);
}
}
sol=-1;
int z=0;
while (ls<=ld)
{
mid=(ls+ld)/2;
if(b[xi][yi]>=mid)
{
q1.push_front(xi);
q2.push_front(yi);
z++;
while (!q1.empty())
{
for(int i=1;i<=4;i++)
{
x=q1.front()+d[i][1];
y=q2.front()+d[i][2];
if (a[x][y]>(-1) && b[x][y]>=mid && m[x][y]!=z )
{
m[x][y]=z;
q1.push_back(x);
q2.push_back(y);
}
}
q1.pop_front();
q2.pop_front();
}
if (m[xf][yf]==z)
{
sol=mid;
ls=mid+1;
}
else ld=mid-1;
} else ld=mid-1;
}
printf("%d\n",sol);
return 0;
}