Pagini recente » Cod sursa (job #572688) | Cod sursa (job #2241406) | Cod sursa (job #1997878) | Cod sursa (job #1641226) | Cod sursa (job #365755)
Cod sursa(job #365755)
#include <stdio.h>
int v[25][25],dr[2][100],d,lee[2][100],o[4],u[4];
int n,i,j,l,r,nx,ny,x,y;
void firewall(int x)
{
int l2=0,r2=1;
while (v[dr[0][l2]][dr[1][l2]]>=-x+1)
{
++l2;
for (i=0;i<4;i++)
{
nx=dr[0][l2]+o[i];
ny=dr[1][l2]+u[i];
if ((0<nx)&&(nx<n+1)&&(ny>0)&&(ny<n+1)&&(v[nx][ny]==0))
{
++r2;
dr[0][r]=nx;
dr[1][r]=ny;
v[nx][ny]=v[dr[0][l2]][dr[1][l2]]-1;
}
}
}
}
int path()
{
l=0;
r=1;
while (l<r)
{
++l;
for (i=0;i<4;i++)
{
nx=lee[0][l]+o[i];
ny=lee[1][l]+u[i];
if ((0<nx)&&(nx<n+1)&&(ny>0)&&(ny<n+1)&&(v[nx][ny]==0))
{
++r;
lee[0][r]=nx;
lee[1][r]=ny;
v[nx][ny]=v[lee[0][l]][lee[1][l]]+1;
}
}
}
return v[x][y];
}
void init()
{
for (i=1;i<n+1;i++)
for (j=1;j<n+1;j++)
v[i][j]=0;
for (i=1;i<d;i++) v[dr[0][i]][dr[1][i]];
}
int cautbin()
{
int lo, hi, mid, last = 0;
for (lo = 1, hi = n-1; lo <= hi; )
{
mid = lo + (hi-lo) / 2;
firewall(mid);
if (path()!=0) last = mid, lo = mid+1;
else hi = mid-1;
init();
}
return last;
}
int main()
{
FILE *f;
char str[100],a[2];
f=fopen("barbar.in","r");
freopen("barbar.out","w",stdout);
fscanf(f,"%d",&n);
for (i=1;i<n+1;i++)
{
fgets(a,2,f);
fgets(str,n+1,f);
for (j=0;j<n;j++)
{
if (str[j]=='*') v[i][j+1]=-1;
else if (str[j]=='D')
{
v[i][j+1]=-2;
++d;
dr[0][r]=i;
dr[1][r]=j+1;
}
else if (str[j]=='I')
{
lee[0][1]=i;
lee[1][1]=j+1;
}
else if (str[j]=='O')
{
x=i;
y=j+1;
}
}
}
cautbin();
printf("\n");
return 0;
}