Pagini recente » Cod sursa (job #3160010) | Cod sursa (job #2961382) | Cod sursa (job #3139020) | Cod sursa (job #1499059) | Cod sursa (job #1926181)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
struct {
int x,y;
}v[1000003],d[1000003];
long long n,m,a[1003][1003],b,k,h,o,lin,col,lt=-1,rt,md,nrdrg,rti;
long long dir_l[4]={-1,0,1,0}, dir_c[4]={0,1,0,-1};
char c;
bool ok=false;
int valid(int r, int c)
{
if(r<=n && c<=m && r>0 && c>0 && a[r][c]==0) return 1;
else return 0;
}
int corect(int r, int c)
{
if(r<=n && c<=m && r>0 && c>0) return 1;
else return 0;
}
int verif()
{
if(a[lin][col]==1000000) return 1;
else return 0;
}
void dmax()
{
for(int ind=1;ind<=nrdrg;++ind)
{
for(int i=-md;i<=0;++i)
{
for(int j=-i-md;j<=i+md;++j)
{
if(valid(i+d[ind].x, j+d[ind].y))
{
a[i+d[ind].x][j+d[ind].y]=1;
}
else if(corect(i+d[ind].x, j+d[ind].y) && a[i+d[ind].x][j+d[ind].y]>999998 )
{
rt--;
break;
}
}
if(rti!=rt)
{
break;
}
}
if(rti!=rt)
{
break;
}
for(int i=1;i<=md;++i)
{
for(int j=-md+i;j<=md-i;++j)
{
if(valid(i+d[ind].x, j+d[ind].y))
{
a[i+d[ind].x][j+d[ind].y]=1;
}
else if(corect(i+d[ind].x, j+d[ind].y) && a[i+d[ind].x][j+d[ind].y]>999998 )
{
rt--;
break;
}
}
if(rti!=rt)
{
break;
}
}
if(rti!=rt)
{
break;
}
}
}
void curat()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(a[i][j]==1) a[i][j]=0;
}
}
}
void afisare()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
}
int main()
{
f>>n>>m;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
f>>c;
if(c=='*') a[i][j]=-2;
else if(c=='D')
{
a[i][j]=-2;
++nrdrg;
d[nrdrg].x=i;
d[nrdrg].y=j;
}
else if(c=='I')
{
a[i][j]=999999;
v[1].x=i;
v[1].y=j;
}
else if(c=='O') a[i][j]=1000000;
}
}
rt=max(n,m)+1;
while(rt-lt!=1)
{
md=(rt+lt)/2;
rti=rt;
dmax();
if(rti!=rt)
{
curat();
}
else {
b=k=1;
while(b<=k)
{
h=v[b].x; o=v[b].y;
for(int i=0;i<=3;++i)
{
lin=h+dir_l[i];
col=o+dir_c[i];
if(valid(lin,col))
{
++k;
v[k].x=lin;
v[k].y=col;
a[lin][col]=1;
}
if(verif())
{
ok=true;
break;
}
}
if(verif()) break;
++b;
}
if(verif()) lt=md;
else rt=md;
curat();
}
}
if(!ok)
{
for(int i=1;i<=nrdrg;++i)
{
a[d[i].x][d[i].y]=0;
}
b=k=1;
while(b<=k)
{
h=v[b].x; o=v[b].y;
for(int i=0;i<=3;++i)
{
lin=h+dir_l[i];
col=o+dir_c[i];
if(valid(lin,col))
{
++k;
v[k].x=lin;
v[k].y=col;
a[lin][col]=1;
}
if(verif())
{
ok=true;
break;
}
}
if(verif()) break;
++b;
}
if(verif())
{
lt=-1;
ok=true;
}
}
if(ok) g<<lt+1;
else g<<-1;
return 0;
}