Pagini recente » Cod sursa (job #421571) | Cod sursa (job #2522280) | Cod sursa (job #2677194) | Cod sursa (job #1757701) | Cod sursa (job #1820685)
#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;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++) b[i][j]=0;
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 ((a[l][c+1]>=k || a[l][c+1]==0) && b[l][c+1]==0) {p++;lin[p]=l;col[p]=c+1;b[l][c+1]=b[l][c]+1;}
if ((a[l][c-1]>=k || a[l][c-1]==0) && b[l][c-1]==0) {p++;lin[p]=l;col[p]=c-1;b[l][c-1]=b[l][c]+1;}
if ((a[l+1][c]>=k || a[l+1][c]==0) && b[l+1][c]==0) {p++;lin[p]=l+1;col[p]=c;b[l+1][c]=b[l][c]+1;}
if ((a[l-1][c]>=k || a[l-1][c]==0) && 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]=0;p++;lin[p]=i;col[p]=j+1;}
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;}
}
}
int auxp=p;
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;
}
for (i=1;i<=p;i++)
{
l=lin[i];
c=col[i];
if (a[l][c+1]==0) {p++;lin[p]=l;col[p]=c+1;a[l][c+1]=a[l][c]+1;}
if (a[l][c-1]==0) {p++;lin[p]=l;col[p]=c-1;a[l][c-1]=a[l][c]+1;}
if (a[l+1][c]==0) {p++;lin[p]=l+1;col[p]=c;a[l+1][c]=a[l][c]+1;}
if (a[l-1][c]==0) {p++;lin[p]=l-1;col[p]=c;a[l-1][c]=a[l][c]+1;}
}
for (i=1;i<=auxp;i++) a[lin[i]][col[i]]=-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;
if (solve(mid)==0) mid--;
if (solve(mid)==1) g<<mid;
else g<<-1;
return 0;
}