Pagini recente » Cod sursa (job #2083544) | Cod sursa (job #1725421) | Cod sursa (job #1005988) | Cod sursa (job #907812) | Cod sursa (job #1884472)
#include <iostream>
#include <cstdio>
#include <cmath>
#define MAXN 1000
using namespace std;
int n,m,dist[MAXN][MAXN],maxim,inc,sf,startx,starty,stopx,stopy;
bool ap[MAXN][MAXN];
char a[MAXN][MAXN],dlin[]={-1,0,1,0},dcol[]={0,1,0,-1};
struct coada
{
int lin,col;
}c[MAXN*MAXN];
inline bool OK(int i,int j)
{
return (i>=0 && j>=0 && i<n && j<m);
}
void Lee()
{
int i,j,i2,j2;
while(inc<sf)
{
i=c[inc].lin;j=c[inc++].col;
for(int d=0;d<4;d++)
{
i2=i+dlin[d];j2=j+dcol[d];
if(OK(i2,j2) && a[i2][j2]!='*' && (!ap[i2][j2] || dist[i2][j2]>dist[i][j]+1))
{
dist[i2][j2]=dist[i][j]+1;
maxim=max(maxim,dist[i2][j2]);
c[sf].lin=i2;c[sf++].col=j2;
ap[i2][j2]=true;
}
}
}
}
inline bool parcurgere(int di)
{
int i,j,i2,j2;
bool viz[MAXN][MAXN];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
viz[i][j]=false;
while(inc<sf && !viz[stopx][stopy])
{
i=c[inc].lin;j=c[inc++].col;
viz[i][j]=true;
for(int d=0;d<4;d++)
{
i2=i+dlin[d];j2=j+dcol[d];
if(OK(i2,j2) && !viz[i2][j2] && dist[i2][j2]>=di)
{
c[sf].lin=i2;c[sf++].col=j2;
viz[i2][j2]=true;
}
}
}
return viz[stopx][stopy];
}
int cbin()
{
int i=0,pas=log2(maxim);
for(pas=1<<pas;pas;pas>>=1)
{
inc=sf=0;
c[sf].lin=startx,c[sf++].col=starty;
if(parcurgere(i+pas))
i+=pas;
}
return i;
}
int main()
{
FILE *fin,*fout;
fin=fopen("barbar.in","r");
fout=fopen("barbar.out","w");
fscanf(fin,"%d%d\n",&n,&m);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
a[i][j]=fgetc(fin);
if(a[i][j]=='D')
{
c[sf].lin=i;c[sf++].col=j;
ap[i][j]=true;
}
else
if(a[i][j]=='I')
startx=i,starty=j;
else
if(a[i][j]=='O')
stopx=i,stopy=j;
}
fgetc(fin);
}
Lee();
fprintf(fout,"%d",cbin());
fclose(fin);
fclose(fout);
return 0;
}