Pagini recente » Borderou de evaluare (job #2145464) | Borderou de evaluare (job #2243292) | Borderou de evaluare (job #2781795) | Borderou de evaluare (job #1824303) | Cod sursa (job #3319246)
#include <bits/stdc++.h>
using namespace std;
int n,m,nrdrag,nr=0,poz1,poz2,fin1,fin2;
int v[2005][2005];
bool vf[2005][2005];
struct cows
{
int a,b;
};
cows dragoni[100005];
cows lista[100005];
void Func(int z)
{
if(z<nr)
{
int x=lista[z].a;
int y=lista[z].b;
if(x-1>0 && v[x-1][y]==0 && vf[x-1][y]!=true)
{
v[x-1][y]=1;
lista[nr].a=x-1;
lista[nr].b=y;
nr++;
}
if(y-1>0 && v[x][y-1]==0 && vf[x][y-1]!=true)
{
v[x][y-1]=1;
lista[nr].a=x;
lista[nr].b=y-1;
nr++;
}
if(x+1<=n && v[x+1][y]==0 && vf[x+1][y]!=true)
{
v[x+1][y]=1;
lista[nr].a=x+1;
lista[nr].b=y;
nr++;
}
if(y+1<=m && v[x][y+1]==0 && vf[x][y+1]!=true)
{
v[x][y+1]=1;
lista[nr].a=x;
lista[nr].b=y+1;
nr++;
}
Func(z+1);
}
}
bool Vf(int y)
{
for(int i=0;i<nrdrag;i++)
{
int x=dragoni[nrdrag].a;
int z=dragoni[nrdrag].b;
int x1=x-y;
if(x1<1)
x1=1;
int z1=z-y;
if(z1<1)
z1=1;
int x2=x+y+1;
int z2=z+y+1;
v[x1][z1]+=-1;
v[x2][z2]+=-1;
v[x1][z2]+=1;
v[x2][z1]+=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
v[i][j]+=v[i-1][j]+v[i][j-1]-v[i-1][j-1];
}
nr=0;
lista[nr].a=poz1;
lista[nr].b=poz2;
nr++;
Func(0);
int ok=0;
if(v[fin1][fin2]==1)
ok++;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
v[i][j]=0;
if(ok==0)
return false;
return true;
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char a;
cin>>a;
if(a=='*')
{
vf[i][j]=true;
}
else if(a=='D')
{
dragoni[nrdrag].a=i;
dragoni[nrdrag].b=j;
nrdrag++;
}
else if(a=='I')
{
poz1=i;
poz2=j;
}
else if(a=='O')
{
fin1=i;
fin2=j;
}
}
}
int st=0,dr=max(n,m);
while(dr-st>1)
{
int mij=(st+dr)/2;
if(Vf(mij)==true)
st=mij;
else
dr=mij;
}
if(Vf(st)==true)
cout<<st<<endl;
else
cout<<-1;
return 0;
}