Pagini recente » Cod sursa (job #1841647) | Cod sursa (job #554895) | Cod sursa (job #1879921) | Cod sursa (job #1843055) | Cod sursa (job #2088316)
#include <fstream>
using namespace std;
ifstream in ("barbar.in");
ofstream out ("barbar.out");
const int N=1003;
const int dl[]={-1,0,1,0};
const int dc[]={0,1,0,-1};
char a[N][N];
struct poz
{
short int l,c;
};
poz q[N*N],start,stop;
int ans,m,n;
int d[N][N];
bool v[N][N];
int verif(int val)
{
int i,j,st=0,dr=0;
poz x,y;
if (d[start.l][start.c]<val)
return 0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
v[i][j]=0;
v[start.l][start.c]=1;
q[0]=start;
while (st<=dr)
{
x=q[st];
for (i=0;i<4;i++)
{
y.l=x.l+dl[i];
y.c=x.c+dc[i];
if (v[y.l][y.c]==0 && d[y.l][y.c]>=val && a[y.l][y.c]!='*')
{
if (a[y.l][y.c]=='O')
return 1;
v[y.l][y.c]=1;
dr++;
q[dr]=y;
}
}
st++;
}
return 0;
}
int main()
{
int i,j,st=1,dr=0,mij;
poz x,y;
in>>n>>m;
in.get();
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
in>>a[i][j];
if (a[i][j]=='D')
{
dr++;
q[dr].l=i;
q[dr].c=j;
v[i][j]=1;
}
else
if (a[i][j]=='I')
start.l=i, start.c=j;
else
if (a[i][j]=='O')
stop.l=i, stop.c=j;
}
in.get();
}
for (i=0;i<=n+1;i++)
a[i][0]=a[i][m+1]='*';
for (j=0;j<=m+1;j++)
a[0][j]=a[n+1][j]='*';
while (st<=dr)
{
x=q[st];
for (i=0;i<4;i++)
{
y.l=x.l+dl[i];
y.c=x.c+dc[i];
if (a[y.l][y.c]!='*' && v[y.l][y.c]==0)
{
dr++;
q[dr]=y;
v[y.l][y.c]=1;
d[y.l][y.c]=d[x.l][x.c]+1;
}
}
st++;
}
ans=-1;
st=1, dr=n*m;
while (st<=dr)
{
mij=(st+dr)/2;
if (verif(mij))
{
st=mij+1;
ans=mij;
}
else
dr=mij-1;
}
out<<ans;
return 0;
}