Pagini recente » Cod sursa (job #496431) | Cod sursa (job #2375898) | Cod sursa (job #1901845) | Cod sursa (job #1025869) | Cod sursa (job #1290880)
#include <fstream>
using namespace std;
const int nmax =1005;
int dx[]={1, -1, 0, 0};
int dy[]={0, 0, 1, -1};
int mat[nmax][nmax], 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[nmax][nmax], 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;
}
}
for(p=1; p<=u; p++)
{
ic=c[0][p];
jc=c[1][p];
for(d=0;d<=3;d++)
{
iv=ic+dx[d];
jv=jc+dy[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;
}
}
}
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+dx[d];
jv=jc+dy[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 && mat[li][ci]>=mid)
{
st=mid+1;
sol=1;
}
else dr=mid-1;
}
if(sol) g<<dr-1<<"\n";
else g<<"-1"<<"\n";
f.close();
g.close();
return 0;
}