Pagini recente » Cod sursa (job #1884523) | Cod sursa (job #485915) | Cod sursa (job #690071) | Cod sursa (job #997434) | Cod sursa (job #1019305)
#include <fstream>
using namespace std;
int di[]={1, -1, 0, 0};
int dj[]={0, 0, 1, -1};
int mat[1002][1002], n, m, li, lf, ci, cf, i, j, u, p, ic, jc, iv, jv, d, dr, st, sol, mid;
int c[2][1000002];
char ch;
bool o[1002][1002], gasit;
int main()
{
ifstream f("barbar.in");
ofstream g("barbar.out");
f>>m;f>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
f>>ch;
if(ch=='*')
mat[i][j]=-1;
else
if(ch=='D')
{
u++;
c[0][u]=i;
c[1][u]=j;
mat[i][j]=1;
}
else
if(ch=='I')
{
li=i;ci=j;
}
else
if(ch=='O')
{
lf=i;cf=j;
}
}
p=1;
while(p<=u)
{
ic=c[0][p];
jc=c[1][p];
for(d=0;d<=3;d++)
{
iv=ic+di[d];
jv=jc+dj[d];
if(iv<=m && iv>0 && jv<=n && jv>0 && mat[iv][jv]==0)
{
u++;
c[0][u]=iv;
c[1][u]=jv;
mat[iv][jv]=mat[ic][jc]+1;
}
}
p++;
}
st=1;dr=n*m;
sol=0;
while(st<=dr)
{
mid=(st+dr)/2;
p=1;u=1;
c[0][u]=li;
c[1][u]=ci;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(mat[i][j]!=-1)
o[i][j]=0;
else
o[i][j]=1;
o[li][ci]=1;
gasit=0;
while(p<=u && !gasit)
{
ic=c[0][p];
jc=c[1][p];
for(d=0;d<=3;d++)
{
iv=ic+di[d];
jv=jc+dj[d];
if(iv<=m && iv>0 && jv<=n && jv>0 && mat[iv][jv]>=mid && o[iv][jv]==0)
{
u++;
c[0][u]=iv;
c[1][u]=jv;
o[iv][jv]=1;
if(iv==lf && jv==cf)
{
gasit=1;
break;
}
}
}
p++;
}
if(gasit)
st=mid+1;
else
dr=mid-1;
}
if(dr-1>0)
g<<dr-1<<"\n";
else
g<<"-1"<<"\n";
/*for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
g<<mat[i][j]<<" ";
g<<"\n";
}*/
f.close();g.close();
return 0;
}