Pagini recente » Cod sursa (job #1747289) | Cod sursa (job #1109686) | Cod sursa (job #592241) | Cod sursa (job #3173351) | Cod sursa (job #2112213)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int dl[]= {-1,0,1,0};
const int dc[]= {0,1,0,-1};
const int N=1002;
int d[N][N],n,m;
bool accesibil[N][N];
struct poz
{
int l,c;
};
poz q[N*N],barbar,iesire;
bool sepoate(int distanta)
{
int st,dr,i,j;
st=0;
dr=-1;
poz x,y;
q[++dr]=barbar;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
accesibil[i][j]=false;
accesibil[barbar.l][barbar.c] = true;
while(st<=dr)
{
x=q[st++];
for(i=0; i<4; i++)
{
y.l=x.l+dl[i];
y.c=x.c+dc[i];
if(d[y.l][y.c]>=distanta && !accesibil[y.l][y.c])
{
q[++dr]=y;
accesibil[y.l][y.c] = true;
}
}
}
return accesibil[iesire.l][iesire.c];
}
const int L=9;
int main()
{
int i,j,st,dr,vmin;
st=0;
dr=-1;
poz x,y;
char t;
//citire
fin>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
fin>>t;
if(t=='.')
{
d[i][j]=-1;
}
else if(t=='*')
{
d[i][j]=-2;
}
else if(t=='D')
{
d[i][j]=0;
q[++dr]=(poz)
{
i,j
};
}
else if(t=='I')
{
barbar=(poz)
{
i,j
};
d[i][j]=-1;
}
else if(t=='O')
{
iesire=(poz)
{
i,j
};
d[i][j]=-1;
}
}
//bordare
for(i=0; i<=n+1; i++)
d[i][0]=d[i][m+1]=-2;
for(j=0; j<=m+1; j++)
d[0][j]=d[n+1][j]=-2;
while(st<=dr)
{
x=q[st++];
for(i=0; i<4; i++)
{
y.l=x.l+dl[i];
y.c=x.c+dc[i];
if(d[y.l][y.c]==-1)
{
q[++dr]=y;
d[y.l][y.c]=1+d[x.l][x.c];
}
}
}
/* for(i=0; i<=n+1; i++)
{
for(j=0; j<=m+1; j++)
fout<<d[i][j]<<" ";
fout<<"\n";
}*/
int r,pas;
pas=1<<L;
r=0;
while(pas!=0)
{
if(sepoate(r+pas)) r+=pas;
pas/=2;
}
fout<<r;
return 0;
}