Pagini recente » Cod sursa (job #2192081) | Cod sursa (job #248758) | Cod sursa (job #1701478) | Cod sursa (job #914478) | Cod sursa (job #2081051)
#include <fstream>
#include <queue>
#define Nmax 1010
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[Nmax][Nmax],n,m,xi,yi,xf,yf;
int nrmax,nrmin=Nmax*Nmax;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int viz[Nmax][Nmax];
void Bordare()
{
int i,j;
for(i=0;i<=n+1;++i)a[i][0]=a[i][m+1]=-1;
for(j=0;j<=m+1;++j)a[0][j]=a[n+1][j]=-1;
}
void Dragon(int x,int y)
{
int i,xv,yv;
for(i=0;i<4;++i)
{
xv=x+dx[i];
yv=y+dy[i];
if(a[xv][yv]==0||a[x][y]+1<a[xv][yv]){a[xv][yv]=a[x][y]+1;
Dragon(xv,yv);}
}
}
void Read()
{
int i,j;
char s[Nmax];
fin>>n>>m;
Bordare();
for(i=1;i<=n;++i)
{
fin>>s;
for(j=0;j<m;++j)
{
if(s[j]=='*')a[i][j+1]=-1;
else if(s[j]=='I'){xi=i; yi=j+1; }
else if(s[j]=='O'){xf=i; yf=j+1; }
else if(s[j]=='D'){a[i][j+1]=1; Dragon(i,j+1); }
nrmax=max(nrmax,a[i][j+1]);
if(a[i][j+1]!=-1)nrmin=min(a[i][j+1],nrmin);
}
}
}
int Lee(int dist)
{
queue<int>c1,c2;
int i,xc,yc,xv,yv,j;
for(i=0;i<=n+1;++i)
for(j=0;j<=m+1;++j)
viz[i][j]=0;
c1.push(xi); c2.push(yi);
viz[xi][yi]=1;
while(!c1.empty()&&viz[xf][yf]==0)
{
xc=c1.front(); yc=c2.front();
c1.pop(); c2.pop();
for(i=0;i<4;++i)
{
xv=xc+dx[i];
yv=yc+dy[i];
if(viz[xv][yv]==0&&a[xv][yv]>=dist)
{
viz[xv][yv]=1;
c1.push(xv);
c2.push(yv);
}
}
}
return viz[xf][yf];
}
int CautareBinara(int s,int d)
{
if(s<d)
{
int m=s+(d-s)/2;
if(Lee(m)) return CautareBinara(m+1,d);
else return CautareBinara(s,m-1);
}
return s;
}
int main()
{
Read();
fout<<CautareBinara(nrmin,nrmax)-1;
return 0;
}