Pagini recente » Cod sursa (job #2458023) | Cod sursa (job #2400012) | Cod sursa (job #2070777) | Cod sursa (job #2263723) | Cod sursa (job #1820673)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
char ch[1010];
int n,m,a[1010][1010],b[1010][1010],lin[1100000],col[1100000],p,lf,cf,l,c,st,dr,mid,x,li,ci;
int solve(int k)
{
int i,j,t,l,c;
l=li;
c=ci;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
b[i][j]=a[i][j];
}
}
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
if (b[i][j]==2)
{
for (t=1;t<=k;t++)
{
if (j-t>=0) b[i][j-t]=1;
if (i-t>=0) b[i-t][j]=1;
b[i+t][j]=1;
b[i][j+t]=1;
}
}
}
}
/*
cout<<n<<" "<<m<<"\n";
for (i=1;i<=n;i++)
{
cout<<"\n";
for (j=1;j<=m;j++) cout<<b[i][j]<<" ";
}
*/
if (b[li][ci]==0)
{
p=1;
lin[p]=li;
col[p]=ci;
b[li][ci]=1;
for (i=1;i<=p;i++)
{
l=lin[i];
c=col[i];
if (b[l][c+1]==0) {p++;lin[p]=l;col[p]=c+1;b[l][c+1]=b[l][c]+1;}
if (b[l][c-1]==0) {p++;lin[p]=l;col[p]=c-1;b[l][c-1]=b[l][c]+1;}
if (b[l+1][c]==0) {p++;lin[p]=l+1;col[p]=c;b[l+1][c]=b[l][c]+1;}
if (b[l-1][c]==0) {p++;lin[p]=l-1;col[p]=c;b[l-1][c]=b[l][c]+1;}
}
if (b[lf][cf]>0) return 1;
else return 0;
}
else return 0;
}
int main()
{
int i,j;
f>>n>>m;
f.getline (ch,2);
for (i=1;i<=n;i++)
{
f.getline (ch,1010);
for (j=0;j<=m-1;j++)
{
if (ch[j]=='D') {a[i][j+1]=2;}
if (ch[j]=='*') {a[i][j+1]=1;}
if (ch[j]=='I') {li=i;ci=j+1;}
if (ch[j]=='O') {lf=i;cf=j+1;}
}
}
for (i=0;i<=n+1;i++)
{
a[i][0]=-1;
a[i][m+1]=-1;
b[i][0]=-1;
b[i][m+1]=-1;
}
for (j=0;j<=m+1;j++)
{
b[0][j]=-1;
b[n+1][j]=-1;
a[0][j]=-1;
a[n+1][j]=-1;
}
st=1;
dr=1000;
while (st<=dr)
{
mid=(st+dr)/2;
x=solve(mid);
if (x==1) st=mid+1;
else dr=mid-1;
}
mid=(st+dr)/2;
x=solve(mid);
if(x==0) mid--;
x=solve(mid);
if (x==1) g<<mid;
else g<<-1;
//x=solve(3);
//cout<<"\n"<<x;
return 0;
}