Pagini recente » Cod sursa (job #1119332) | Cod sursa (job #419898) | Cod sursa (job #95965) | Autentificare | Cod sursa (job #2081114)
#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;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int viz[Nmax][Nmax];
queue<int>cdx,cdy;
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 i,xc,yc,xv,yv;
while(!cdx.empty())
{
xc=cdx.front(); yc=cdy.front();
cdx.pop(); cdy.pop();
for(i=0;i<4;++i)
{
xv=xc+dx[i];
yv=yc+dy[i];
if(viz[xv][yv]==0&&((a[xc][yc]+1<a[xv][yv]&&a[xv][yv]!=-1)||a[xv][yv]==0))
{
a[xv][yv]=a[xc][yc]+1;
nrmax=max(a[xv][yv],nrmax);
viz[xv][yv]=1;
cdx.push(xv);
cdy.push(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;cdx.push(i);cdy.push(j+1);viz[i][j+1]=1; }
}
}
}
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(xv==xf&&yv==yf)return 1;
if(viz[xv][yv]==0&&a[xv][yv]>=dist)
{
viz[xv][yv]=1;
c1.push(xv);
c2.push(yv);
}
}
}
return 0;
}
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;
}
void Print()
{
int i,j;
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
fout<<a[i][j]<<" ";
fout<<"\n";
}
}
int main()
{
Read();
Dragon();
int val=CautareBinara(1,nrmax);
if(val==1)fout<<"-1";
else {
while(Lee(val)==0)--val;
fout<<val-1;
}
return 0;
}