Pagini recente » Cod sursa (job #352305) | Cod sursa (job #2765377) | Cod sursa (job #83578) | Cod sursa (job #2195430) | Cod sursa (job #2905838)
#include <fstream>
using namespace std;
ifstream cin ("barbar.in");
ofstream cout ("barbar.out");
int dragoni[1010][1010],viz[1010][1010],dirL[4]={-1,0,1,0},dirC[4]={0,1,0,-1};
struct ura
{
int l,c;
};
ura coada[1000010];
int main()
{
int n,m,i,j,ctd,inc,sf,lin,col,minn,l_start,c_start,l_finish,c_finish,pp,st,dr,mijl,ans;
char ch;
cin>>n>>m;
ctd=0;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
{
cin>>ch;
if (ch=='I')
{
l_start=i;
c_start=j;
}
if (ch=='O')
{
l_finish=i;
c_finish=j;
}
if (ch=='D')
{
ctd++;
coada[ctd].l=i;
coada[ctd].c=j;
dragoni[i][j]=1;
}
if (ch=='*')
{
dragoni[i][j]=-1;
viz[i][j]=-1;
}
}
for (i=0; i<=n+1; i++)
viz[i][0]=viz[i][m+1]=dragoni[i][0]=dragoni[i][m+1]=-1;
for (j=0; j<=m+1; j++)
viz[0][j]=viz[n+1][j]=dragoni[0][j]=dragoni[n+1][j]=-1;
inc=1;
sf=ctd;
while (inc<=sf)
{
for (i=0; i<=3; i++)
{
lin=coada[inc].l+dirL[i];
col=coada[inc].c+dirC[i];
if (dragoni[lin][col]==0 || dragoni[coada[inc].l][coada[inc].c]+1<dragoni[lin][col])
{
sf++;
coada[sf].l=lin;
coada[sf].c=col;
dragoni[lin][col]=dragoni[coada[inc].l][coada[inc].c]+1;
}
}
inc++;
}
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
if (dragoni[i][j]>=1)
dragoni[i][j]--;
st=1;
dr=dragoni[l_start][c_start]+1;
ans=-1;
while (st<=dr)
{
mijl=(st+dr)/2;
for (i=0; i<=n+1; i++)
for (j=0; j<=m+1; j++)
if (dragoni[i][j]==-1 || dragoni[i][j]<mijl)
viz[i][j]=-1;
else
viz[i][j]=0;
if (viz[l_start][c_start]==0)
{
viz[l_start][c_start]=1;
inc=1;
sf=1;
coada[1].l=l_start;
coada[1].c=c_start;
while (inc<=sf)
{
for (i=0; i<=3; i++)
{
lin=coada[inc].l+dirL[i];
col=coada[inc].c+dirC[i];
if (viz[lin][col]==0)
{
sf++;
coada[sf].l=lin;
coada[sf].c=col;
viz[lin][col]=1;
}
}
inc++;
}
}
if (viz[l_finish][c_finish]==1)
{
st=mijl+1;
ans=mijl;
}
else
dr=mijl-1;
}
cout<<ans;
return 0;
}